#c #pointers #ampersand
#c #указатели #амперсанд
Вопрос:
Итак … у меня есть следующий код:
int main(void)
{
const char *s="hello, world";
cout<<amp;s[7]<<endl;
return 0;
}
и он печатает «world» … однако я не понимаю, почему это:
int main(void)
{
const char *s="hello, world";
cout<<s[7]<<endl;
return 0;
}
будет выводиться только «w» (все, что я изменил, это избавился от амперсанда), но я думал, что это оператор «address of» … что заставляет меня задуматься, зачем вам это нужно и какова его функция?
Ответ №1:
s[7]
является символом 'w'
, поэтому amp;s[7]
становится адресом символа 'w'
. И когда вы передаете адрес char*
типа cout
в 'w'
, он печатает все символы, начиная с символа и заканчивая нулевым символом, который является концом строки, т. е. он продолжает печатать символы
и далее, пока не найдет в ,, . Вот как world
выводится на печать.
Это похоже на это,
const char *s="hello, world";
const char *pchar = amp;s[7]; //initialize pchar with the address of `w`
cout<< pchar <<endl; //prints all chars till it finds ``
Вывод:
world
Однако, если вы хотите напечатать адрес s[7]
, то есть значение amp;s[7]
, тогда вам придется сделать это:
cout << ((void*)amp;s[7]) << endl; //it prints the address of s[7]
Теперь мы передаем адрес void*
типа, поэтому cout
мы не сможем вывести то, что он использовал для вывода с char*
типом address . void*
скрывает всю информацию, касающуюся содержимого адреса. Итак, cout
просто выводится сам адрес. В конце концов, это то, что он получает максимально.
Онлайн-демонстрация:http://www.ideone.com/BMhFy
Ответ №2:
Ваш заголовок не соответствует вашему вопросу… вообще.
Поскольку s
это указатель на символ (он же строка в стиле C), s[7]
это символ. Поскольку s[7]
это символ, amp;s[7]
это указатель на символ (он же строка в стиле C).
Ответ №3:
s[7] — это символ. (Вы можете индексировать указатели на массив, как если бы это было просто имя массива).
amp;s[7] — это указатель на символ с индексом 7. его тип — char* , поэтому средство вставки потока обрабатывает его как char * .