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

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

int a[2][3];

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

int (*p)[3] = a;

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

Ответ 1

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

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]);

Ответ 2

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, который является элементом массива массивов.

Ответ 3

Строго говоря, no, 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].

Ответ 4

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

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

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[][] */

Ответ 5

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

int *p[5]        // p is an array of 5 pointers

int (*p)[5]      // p points to an array of 5 ints

int (*(p+5))[10] // p is a pointer to a structure where the structure 5th element has 10 ints .

Ответ 6

Вы можете указать на 2d массив, как 1d массив

#include <iostream>
int main()
{
   int array[2][2] = {{0,1}, {2,3}}; // array
   int *ptr;
   ptr=(int*)array;
   std::cout << *(ptr)   << '\n';//out 0
   std::cout << *(ptr+1) << '\n';//out 1 
   std::cout << *(ptr+2) << '\n';//out 2
   std::cout << *(ptr+3) << '\n';//out 3
}