给定一个二维数组 int[][],创建一个指针 int(*)[] 是什么意思?

52
我有一个关于指向二维数组的问题。如果一个数组是这样的
int a[2][3];

这是一个指向数组 a 的指针吗?
int (*p)[3] = a;

如果这是正确的,我想知道[3]int(*p)[3]中代表什么意思?
6个回答

43
int a[2][3];

在这里,a 被解释为一个 2 维度的数组,其中每个元素都是一个由 3 个整数组成的数组,也就是一个二维数组。当你编写以下代码时:

int (*p)[3] = a;

它声明了 p 为指向第一个元素的指针,而第一个元素是一个 数组。因此,p 指向的是包含 3 个整数的数组,该数组是二维数组的一个元素。

考虑以下示例:

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

在这里,p 是指向一个由3个整数构成的数组的指针,该数组是一个数组元素。


“p” 不会成为一个由 3 个整型指针组成的数组,第一个值指向 “a” 的第一个值吗? - Matthew

40

与其将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]);

2
你甚至可以写 [3]a 作为例子 :) 这是学习 C 语言数组的好方法。 - vsz
1
这个声明需要多少内存:int (*p)[65];?这是一个指针还是65个指针? - Danijel

12

严格来说,int (*p)[3] = a; 不是指向 a 的指针。它是指向 a 的第一个元素的指针。 a 的第一个元素是三个整数的数组。 p 是指向三个整数数组的指针。

指向数组 a 的指针应该这样声明:

int (*q)[2][3] = &a; 
pq的数值很可能是相同的(也许甚至是必须相同),但它们是不同类型的。当你对pq进行算术运算时,这将会发挥作用。p+1指向数组a的第二个元素,而q+1指向刚好超出数组a的内存空间。

记住:cdecl是你的朋友:int a[2][3]int (*q)[2][3]


6

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

谢谢您的评论。当您说“size”时,是指(*p)有[0]、[1]、[2]吗?如果是这种情况,那么[2]的位置在哪里呢?还是它指向[0][0]和[0][1]? - user1047092
p 只是一个指向包含3个整数的数组的指针。它不知道 a 的第一维是2,因为它被分配给了 a 的第一个元素,该元素恰好是类型为 int[3] - Blagovest Buyukliev

3

另外需要注意的是:

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 .

OP提出了一个概念性问题,我已在此回答。将5替换为3!另外,我还添加了更多关于如何使用指针从2D数组中获取值的细节。 - sdinesh94
我认为这比其他答案更令人困惑。 - rayryeng

3

您可以像处理一维数组一样处理二维数组

#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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接