Здравствуйте. Недавно начал изучать указатели в c++ , и столкнулся с проблемой. Почему указателю на char* temp присваивается строка , а не адрес
По идее туда должен же присваиваться адрес. И почему не возникает ошибки
Ответы (1 шт):
При присваивании чего-либо чему-либо обычно (это не всегда так, но для простых типов практически без исключений) создается копия присваемого значения, и записывается в присваеваемую переменную.
Например,
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;