Указатель на 2d-массив

У меня вопрос о указателе на 2d-массив. Если массив похож на

int a[2][3]; 

то это указатель на массив a ?

 int (*p)[3] = a; 

Если это правильно, мне интересно, что означает [3] от int(*p)[3] ?

Вместо того, чтобы ссылаться на int[2][3] как «2d-массив», вы должны считать его «массивом массивов». Это массив с двумя элементами в нем, где каждый элемент сам является массивом с тремя целями в нем.

 int (*p)[3] = a; 

Вы можете использовать p чтобы указать на любой из двух элементов в a . p указывает на массив с тремя целями – а именно, первый такой элемент. p+1 будет указывать на второй массив с тремя целями. Чтобы инициализировать p для указания на второй элемент, используйте:

 int (*p)[3] = &(a[1]); 

Ниже приведены эквивалентные способы указания первого из двух элементов.

 int (*p)[3] = a; // as before int (*p)[3] = &(a[0]); 
 int a[2][3]; 

a считывается как массив 2 массива 3 из int, который представляет собой просто массив массивов. Когда вы пишете,

int (*p)[3] = a;

Он объявляет p как указатель на первый элемент, который является массивом . Таким образом, p указывает на массив из 3 ints, который является элементом массива массивов.

Рассмотрим этот пример:

  int a[2][3] +----+----+----+----+----+----+ | | | | | | | +----+----+----+----+----+----+ \_____________/ | | | p int (*p)[3] 

Здесь p – ваш указатель, который указывает на массив из 3 ints, который является элементом массива массивов.

Строго говоря, нет, int (*p)[3] = a; не является указателем на a . Это указатель на первый элемент a . Первый элемент a представляет собой массив из трех целых чисел. p – указатель на массив из трех целых чисел.

Указатель на массив a будет объявлен таким образом:

 int (*q)[2][3] = &a; 

Числовое значение p и q вероятно (или, возможно, даже требуется) одинаково, но они имеют разные типы. Это будет действовать, когда вы выполняете арифметику на p или q . p+1 указывает на второй элемент массива a , а q+1 указывает на память сразу за концом массива a .

Помните: cdecl – ваш друг: int a[2][3] , int (*q)[2][3] .

[3] является частью типа. В этом случае p является указателем на массив размером 3, который содержит ints.

Конкретный тип массива всегда включает его размер, так что у вас есть типы int *[3] или int *[5] , но не только int *[] с неопределенным размером.

 int *x[20]; /* type of x is int *[20], not just int *[] */ int y[10][10]; /* type of y is int[10][10], not just int[][] */ 

Также обратите внимание:

int * p [5] // p – массив из 5 указателей

int (* p) [5] // p указывает на массив из 5 ints

int (* (p + 5)) [10] // p – указатель на структуру, в которой 5-й элемент структуры имеет 10 int.

  • Являются ли a, & a, a, a , & a и & a одинаковыми указателями?
  • Почему я не могу обработать массив как указатель в C?
  • Указатели в c ++ после удаления
  • Параметр, проходящий в C - указатели, адреса, псевдонимы
  • Почему не указатели инициализируются с помощью NULL по умолчанию?
  • Безопасно ли удалить указатель NULL?
  • Что такое тип данных uintptr_t
  • Можно ли программно определить размер массива C ++? А если нет, то почему?
  • Использование стрелки (->) в C
  • Указатель против ссылки
  • Что такое имя массива в c?
  • Давайте будем гением компьютера.