В C, когда вы использовали имя массива в выражении (включая передачу его функции), если он не является операндом оператора адреса (&
) или оператора sizeof
, он распаковывает на указатель на его первый элемент.
То есть, в большинстве контекстов array
эквивалентно &array[0]
как для типа, так и для значения.
] В вашем примере my_array
имеет тип char[100]
, который распадается на char*
, когда вы передаете его в printf.
&my_array
имеет тип char (*)[100]
(указатель на массив из 100 char
]). Поскольку это операнд &
, это один из случаев, когда my_array
не сразу разлагается на указатель на его первый элемент.
Указатель на массив имеет одинаковое значение адреса как указатель на первый элемент массива, поскольку объект массива является просто непрерывной последовательностью его элементов, но указатель на массив имеет другой тип для указателя на элемент этого массива. Это важно, когда вы выполняете арифметику указателя на двух типах указателя.
pointer_to_array
имеет тип char *
- инициализируется для указания на первый элемент массива, поскольку это то, что my_array
распадается на в выражении инициализатора - и &pointer_to_array
имеет тип char **
(указатель на указатель на char
).
Из них: my_array
(после распада на char*
), &my_array
и pointer_to_array
все указывают непосредственно на массив или первый элемент массива и поэтому имеют одинаковое значение адреса.