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

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

48 голосов
/ 23 декабря 2011

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

int a[2][3];

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

int (*p)[3] = a;

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

Ответы [ 6 ]

37 голосов
/ 23 декабря 2011
int a[2][3];

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

int (*p)[3] = a;

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

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

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

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

36 голосов
/ 23 декабря 2011

Вместо того, чтобы ссылаться на 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]);
8 голосов
/ 23 декабря 2011

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

5 голосов
/ 23 декабря 2011

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

Конкретный тип массива всегда включает его размер, поэтому у вас есть типы 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[][] */
1 голос
/ 25 октября 2015

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

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's 5th element has 10 ints .
0 голосов
/ 05 февраля 2019

Вы можете указать на 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...