:)
это мой код:
int main(void)
{
char num[11] = { "Mississippi" };
printf("%p\n", &num); // prints 0x7fffe44a5eb0
printf("%p\n", num); // prints 0x7fffe44a5eb0
printf("%c\n", *num); // prints M
return EXIT_SUCCESS;
}
почему я получаю один и тот же адрес для:
printf("%p\n", &num);
и для:
printf("%p\n", num);
?
не должен & num печатать адрес самого указателя, а num печатать адрес «ячейки», в которой хранится M?
приветствуется любой вклад! ваше здоровье
Предлагаемый мной дубликат также является первым хитом Google (для меня) для поиска в Google заголовка вашего вопроса ...





Нет, массив не является указателем. Но он может разлагаться указывать на свой первый элемент. Вот почему num такой же, как &num[0]. Тип этого указателя - char *.
Выражение &num совершенно другое, так как это указатель на сам массив. Тип этого - char (*)[11]. Так уж получилось, что и num (и, следовательно, &num[0]), и &num указывают на одно и то же местоположение, но, поскольку это разные типы, они семантически различаются.
Несколько «графически» вы могли бы увидеть свой массив так:
+---+---+---+---+---+---+---+---+---+---+---+ | M | i | s | s | i | s | s | i | p | p | i | +---+---+---+---+---+---+---+---+---+---+---+ ^ ^ ^ ^ | | | | | | &num[2] ... &num[11] | | | | &num[1] (&num)[1] | &num[0] | &num
И, повторюсь, простой num будет разлагаться (т.е. будет переведен компилятором) в &num[0]. И &num, и &num[0] указывают на одно и то же место, но относятся к разным типам.
С другой стороны, помните, что строки char в C на самом деле называются байтовыми строками оканчивающийся нулем. Этот нуль-терминатор делает строку строкой, и все функции обработки строк используют этот терминатор, чтобы узнать, где находится конец строки.
В вашем массиве нет места для этого терминатора.
спасибо за ответ! Однако я до сих пор не понимаю, почему адрес самого указателя и значение указателя могут быть одинаковыми. это похоже на то, что указатель указывает на себя ... что должно быть бесполезным?
@Bobstanley Обновлено с помощью «изображения», чтобы, надеюсь, сделать его более понятным.
Адрес указателя является адрес первого индекса.