Как

#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 * .