Здравствуйте. Недавно начал изучать указатели в c++ , и столкнулся с проблемой. Почему указателю на char* temp присваивается строка , а не адрес

По идее туда должен же присваиваться адрес. И почему не возникает ошибки


Ответы (1 шт):

Автор решения: Mikhailo

При присваивании чего-либо чему-либо обычно (это не всегда так, но для простых типов практически без исключений) создается копия присваемого значения, и записывается в присваеваемую переменную.

Например,

int x;
x = y;

Здесь значение из переменной y копируется в переменную x.

Когда рассматриваются строки в стиле C, то есть просто массивы char'ов, оканчивающиеся нулевым символом, то такая строка значением не является. Значением является ее адрес, то есть место, где этот массив лежит в памяти.

Так что когда вы пишете что-то вроде

const char * s = "Hello, world";

строка "Hello, world" хранится где-то в памяти, а в переменную s записывается ее адрес.

Именно поэтому никакие действия наподобие "сложения" или "сравнения" строк не дают ожидаемого некоторыми результата, потому что это адреса, а не содержимое.

Именно в этом смысле указателю "присваивается строка".

Другое дело, что С++ сделан совместимым с С насколько это возможно, и потому иногда рассматривает строки, которые являются массивами символов, не так, как прочие массивы. В первую очередь это относится к выводу на экран. В 99,9..% (не знаю, сколько там девяток надо) случаев при выводе программист хочет вывести именно строку, на которую указывает указатель, а не адрес. Поэтому сделано так, что в

int * a; char * s;
....
cout << a;
cout << s;

первый вывод будет выводить адрес, а второй - строку, находящуюся по этому адресу.

Если нужно вывести именно адрес, надо привести указатель к другому виду, например,

cout << (void*)s;
→ Ссылка