Друзья, помогите джуну в C++! Когда пишем
char *str = "Hello";
То мы создаем указатель на первый символ в этой строке?
Тогда почему в cout << str;
выводится вся строка, а не адрес первого символа?
Потому, что существует перегруженная версия оператора <<
для char *
которая интерпретирует указатель на char
как строку в стиле C.
Если вы хотите вывести на печать адрес первого элемента массива, то нужно воспользоваться версией <<
, которая не интерпретирует операнд как строку:
std::cout << (void *) str << std::endl;
Для char*
возможно определить operator <<
так, чтобы в поток вводить все символы:
ostream& operator <<(ostream& os, const char* p)
{
while (*p != '\0')
os << *p++;
return os;
}
в стандарте такое определение какраз и существует, но для других типов это невозможно, потому что в таком случаи нужно передать еше и размер, так как у других типов массив не ограничен специальным символом, но размер не можем передать, постольку поскольку этот оператор имеет 2 аргумента ("третий лишный").
Для эксперимента, вы можете определить свою версию, если уверены, что ваш указатель укажет на строку с более чем двух символов
#include <iostream>
using namespace std;
ostream& operator <<(ostream& os, const char* p)
{
while (*(p + 2) != '\0')
os << *p++;
return os;
}
int main()
{
const char* str= "hello"; //Да, именно const char*, а не char*
cout << str; // выдаст "hel", т.е. на 2 символа меньше
return 0;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Дано бинарное дерево,рандомно было записано данныеДалее необходимо удалить все простые числа
Не могу нагуглить конкретный ответ
Есть класс ClassName который определен в динамической библиотеке, и который используется в исполняемом файлеВо время выполнения возникает ошибка