Понимание ссылки на символ - PullRequest
10 голосов
/ 13 февраля 2012

Я написал этот простой скрипт, чтобы понять, что такое ссылка, и застрял в массиве символов.

int numbers[5] = {3, 6, 9, 12, 15};

for (int i = 0; i < 5; i++)
{
    cout << numbers[i] << endl;
    cout << &numbers[i] << endl;
}

cout << "--------------" << endl;

char letters[5] = {'a', 'b', 'c', 'd', 'e'};

for (int i = 0; i < 5; i++)
{
    cout << letters[i] << endl;
    cout << &letters[i] << endl;
}

и это вывод:

3
0xbffff958
6
0xbffff95c
9
0xbffff960
12
0xbffff964
15
0xbffff968
--------------
a
abcde
b
bcde
c
cde
d
de
e

В массиве int, когда я использую &numbers[i], я получаю странное число, которое является ячейкой памяти. Хорошо; это именно то, что я понял.

Но с char я не понимаю, почему у меня такой вывод.

Ответы [ 3 ]

13 голосов
/ 13 февраля 2012

Причина в том, что cout "знает", что делать со значением char * - он печатает символьную строку в виде строки C с нулевым символом в конце.

То же самое не относится к значению int *, поэтому cout вместо этого печатает значение указателя.

Вы можете принудительно вывести значение указателя путем приведения:

cout << static_cast<void *>(&letters[i]) << endl;
2 голосов
/ 13 февраля 2012

Когда вы передаете ostream::operator<< (фактически это глобальная функция, а не оператор) аргумент типа char*, он считается строкой с нулевым символом в конце.

2 голосов
/ 13 февраля 2012

Вы смотрите на особенность потоков C ++. Он пытается преобразовать свои аргументы во что-то, что обычно печатается. Тип этого выражения: &ints[x] int*. &chars[x] становится char*, что, кстати, также является типом строки символов C. Поскольку мы хотим, чтобы cout << "FOO"' распечатывал всю строку, необходимо иметь такое поведение. В вашем случае это на самом деле приводит к неопределенному поведению, так как используемая вами строка не заканчивается правильно нулем. Для решения этой проблемы используйте static_cast.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...