У меня вопрос о указателе на 2d-массив. Если массив похож на
int a[2][3];
то это указатель на массив a
?
int (*p)[3] = a;
Если это правильно, мне интересно, что означает [3]
от int(*p)[3]
?
У меня вопрос о указателе на 2d-массив. Если массив похож на
int a[2][3];
то это указатель на массив a
?
int (*p)[3] = a;
Если это правильно, мне интересно, что означает [3]
от int(*p)[3]
?
Вместо того, чтобы ссылаться на 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]);
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, который является элементом массива массивов.
Строго говоря, 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]
.
[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[][] */
Также обратите внимание:
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 .
Вы можете указать на 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
}