Тип объекта, на который указывает указатель объявлен как
int (*pointer_name)[5] = &array_name;
является int[5]
. Это означает, например, что этот оператор
sizeof(*pointer_name)
дает значение, равное 5 * sizeof(int)
. И что если использовать арифметику указателя, например, pointer_name + 1
, то адрес, полученный этим выражением, будет равен адресу, сохраненному в указателе плюс значение 5 * sizeof(int)
.
Тип объекта, на который указывает указатель объявлен как
int *pointer_name = array_name;
является int
. Это означает, например, что этот оператор
sizeof(*pointer_name)
дает значение, равное sizeof(int)
. И что если использовать арифметику указателя, например, pointer_name + 1
, то адрес, полученный этим выражением, будет равен адресу, сохраненному в указателе плюс значение sizeof(int)
.
указатель объявлен как этот
int (*pointer_name)[5];
обычно используется для двумерных массивов, что указывает на «строки» из массива.
Например
int array_name[2][5];
int (*pointer_name)[5] = array_name;
// outputs 20 provided that sizeof(int) is equal to 4
printf("%zu\n", sizeof(*pointer_name));
// outputs 4 provided that sizeof(int) is equal to 4
printf("%zu\n", sizeof(**pointer_name));
pointer_name
указывает на первой строке массива array_name
. pointer_name + 1
указывает на вторую строку массива.
«Я узнал, что имя массива на самом деле является адресом array_name [0]». Вы учились неправильно. Имя массива может * действовать как * (* притворяться *) указателем на 'array_name [0]' в определенных контекстах, но не во всех контекстах. И вы определенно не можете сказать, что имя массива * - это адрес 'array_name [0]'. – AnT