我有一个关于指向二维数组的问题。如果一个数组是这样的
这是一个指向数组
如果这是正确的,我想知道
int a[2][3];
这是一个指向数组
a
的指针吗?int (*p)[3] = a;
如果这是正确的,我想知道
[3]
在int(*p)[3]
中代表什么意思?int a[2][3];
a
的指针吗?int (*p)[3] = a;
[3]
在int(*p)[3]
中代表什么意思?int a[2][3];
在这里,a
被解释为一个 2 维度的数组,其中每个元素都是一个由 3 个整数组成的数组,也就是一个二维数组。当你编写以下代码时:
int (*p)[3] = a;
它声明了 p
为指向第一个元素的指针,而第一个元素是一个 数组。因此,p
指向的是包含 3 个整数的数组,该数组是二维数组的一个元素。
考虑以下示例:
int a[2][3]
+----+----+----+----+----+----+
| | | | | | |
+----+----+----+----+----+----+
\_____________/
|
|
|
p int (*p)[3]
在这里,p
是指向一个由3个整数构成的数组的指针,该数组是一个数组元素。
与其将int[2][3]
称为'2d数组',你应该将其视为'数组的数组'。这是一个包含两个项目的数组,其中每个项目本身都是一个具有3个int的数组。
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]);
[3]a
作为例子 :) 这是学习 C 语言数组的好方法。 - vszint (*p)[65];
?这是一个指针还是65个指针? - Danijel严格来说,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的int数组的指针。
数组的特定类型总是包括其大小,因此您有类型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[][] */
p
只是一个指向包含3个整数的数组的指针。它不知道 a
的第一维是2,因为它被分配给了 a
的第一个元素,该元素恰好是类型为 int[3]
。 - Blagovest Buyukliev另外需要注意的是:
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 .
您可以像处理一维数组一样处理二维数组
#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
}