指向2d数组的指针

use*_*092 48 c++ arrays pointers multidimensional-array

我有一个关于指向2d数组的指针的问题.如果数组是这样的

int a[2][3];
Run Code Online (Sandbox Code Playgroud)

那么,这是一个指向数组的指针a吗?

int (*p)[3] = a;
Run Code Online (Sandbox Code Playgroud)

如果这是正确的,我想知道什么[3]意思int(*p)[3]

cpx*_*cpx 38

int a[2][3];
Run Code Online (Sandbox Code Playgroud)

a被读作int的数组3的数组2,它只是一个数组数组.写的时候

int (*p)[3] = a;

它声明p为指向第一个元素的指针,该元素是一个数组.因此,p指向3个int的数组,它是数组数组的元素.

考虑这个例子:

        int a[2][3]
+----+----+----+----+----+----+
|    |    |    |    |    |    |
+----+----+----+----+----+----+
\_____________/
       |
       |    
       |
       p    int (*p)[3]
Run Code Online (Sandbox Code Playgroud)

这里,p你的指针指向3个int的数组,它是数组数组的元素.


Aar*_*aid 36

int[2][3]您应该将其视为"数组数组",而不是将其称为"二维数组".它是一个包含两个项目的数组,其中每个项目本身就是一个包含3个int的数组.

int (*p)[3] = a;
Run Code Online (Sandbox Code Playgroud)

您可以使用p它指向两个项目中的任何一个a.p指向一个三int数组 - 即第一个这样的项.p+1会指向第二个三int数组.要初始化p以指向第二个元素,请使用:

int (*p)[3] = &(a[1]);
Run Code Online (Sandbox Code Playgroud)

以下是指向两个项目中第一个的等效方法.

int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);
Run Code Online (Sandbox Code Playgroud)

  • @vsz:你的意思是'3 [a]`. (9认同)
  • 你甚至可以写`[3] a`例如:)这是学习C中的数组的好方法. (2认同)

Rob*_*obᵩ 8

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

a因此将声明指向该数组的指针:

int (*q)[2][3] = &a; 
Run Code Online (Sandbox Code Playgroud)

的数值pq有可能(或者甚至要求是)相同,但它们是不同类型的.当您对p或执行算术运算时,这将发挥作用q.p+1指向数组的第二个元素a,同时q+1指向内存刚好超出数组的末尾a.

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


Bla*_*iev 5

[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[][] */
Run Code Online (Sandbox Code Playgroud)