Запустив эту программу на своем компьютере, я получаю те же адреса. Я за array
и &array[0]
Я понимаю, что имя array
указывает на адрес первого элемента в array
. И оба они одинаковы.
Но я не могу понять, почему имя array
и &array
указывает на один и тот же адрес. Что мне приходит в голову, так это то, что он напечатает адрес того пионтера, в котором хранится адрес первого элемента в массиве.
#include <stdio.h>
int main()
{
char arr[3];
printf("array = %p\n", arr);
printf("&array[0] = %p\n", &arr[0]);
printf("&array = %p\n", &arr);
return 0;
}
array = 0061FF1D
&array[0] = 0061FF1D
&array = 0061FF1D
Важно отметить, что хотя между массивами и указателями есть некоторое сходство, они не совпадают.
Имя array
не указывает на адрес первого элемента. Фактически это весь массив. Путаница возникает из-за того, что в большинстве случаев имя массива сводится к указателю на его первый член.
Два примечательных места, где не происходит распада массива на указатель, — это когда массив является операндом либо оператора sizeof
, либо оператора адреса &
. Что касается последнего, массив — это непрерывный набор объектов, и (как и любой объект) он имеет адрес. Адрес массива совпадает с адресом его первого члена, поэтому array
(при использовании в выражении или эквивалентно &array[0]
) и &array
будут иметь одно и то же значение, но разные типы.
В вашем конкретном случае &array[0]
имеет тип char *
, а &array
имеет тип char (*)[3]
(т.е. указатель на массив char
размера 3).
1 + 2
и 1.0 + 2.0
имеют одинаковую сумму значений, но разных типов. printf("%p\n", arr); printf("%p\n", &arr); printf("%p\n", &arr[0]);
печать одного и того же не означает, что arr
и &arr
это одно и то же — больше, чем 3 и 3.0 отличаются некоторыми атрибутами.
Массивы просто особенные в C. И когда я говорю «особенный», я имею в виду пренебрежительное отношение. Просто нужно узнать подробности.