Как & x отличается от x, если x является указателем? - PullRequest
3 голосов
/ 25 мая 2011

Итак ... У меня есть следующий код:

int main(void)
{
const char *s="hello, world";
cout<<&s[7]<<endl;

return 0;
}

и он печатает "мир" ... однако я не понимаю, почему это:

int main(void)
{
const char *s="hello, world";
cout<<s[7]<<endl;

return 0;
}

тольконапечатает "w" (все, что я изменил, это избавился от амперсанда), но я подумал, что это был оператор "адрес" ... что заставляет меня задуматься, зачем вам это нужно и какова его функция?

Ответы [ 3 ]

10 голосов
/ 25 мая 2011

s[7] - это символ 'w', поэтому &s[7] становится адресом символа 'w'. И когда вы передаете адрес типа char* в cout, он печатает все символы, начиная с символа, до нулевого символа, являющегося концом строки, т.е. он продолжает печатать символы из 'w' вперед, пока не найдет \0. Так печатается world.

Это так,

const char *s="hello, world";
const char  *pchar = &s[7]; //initialize pchar with the address of `w`
cout<< pchar <<endl; //prints all chars till it finds `\0` 

Выход:

world

Однако, если вы хотите напечатать адрес s[7], т.е. значение &s[7], то вам нужно сделать это:

cout << ((void*)&s[7]) << endl; //it prints the address of s[7]

Теперь мы передаем адрес типа void*, поэтому cout не сможет вывести то, что использовалось для вывода с адресом char*. void* скрывает всю информацию, касающуюся содержимого адреса. cout просто печатает адрес . В конце концов, именно это он и получает.

Онлайн демонстрация: http://www.ideone.com/BMhFy

4 голосов
/ 25 мая 2011

Ваш заголовок не соответствует вашему вопросу ... вообще.

Поскольку s - указатель на символ (он же строка в стиле C), s[7] - символ.Поскольку s[7] является символом, &s[7] является указателем на символ (он же строка в стиле C).

0 голосов
/ 25 мая 2011

с [7] является символом. (Вы можете индексировать указатели на массив, как если бы это было просто имя массива).

& s [7] - указатель на символ в индексе 7. его тип - char *, поэтому средство вставки потока обрабатывает его как char *.

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