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