2D数组的名称是否在C中给出其基址?

时间:2012-06-18 08:57:53

标签: c

2D阵列的名称是否像在1D数组中那样在C中给出其基址?如何将2d数组的基址存储在指针变量中?

5 个答案:

答案 0 :(得分:3)

它衰减到指向第一个元素的指针:

int a[5][7];

衰败到

int (*pa)[7] = a;

实际上,pa中存储的值与指向int的第一个a元素的指针的值相同,但获取指针的值是正确的。 a的第一个元素是使用

int *p_elm = &(a[0][0]);

或等效

int *p_elm = &(pa[0][0]);

但是,请注意,指向第一个元素的指针不能(严格地)被视为指向N*M数组开头的指针;见例如http://www.lysator.liu.se/c/c-faq/c-2.html#2-11

答案 1 :(得分:2)

是的,您将地址存储为:

int *p = &a[0][0];

答案 2 :(得分:2)

2D数组本质上是一维数组,其中每个元素本身就是一个数组。

数组的名称等同于& arrayName [0]。

指定此地址的指针与以前一样,如:

int myArray[5][5];
int (*arrayptr)[5] = myArray;

这表示arrayptr是一个指向5个整数数组的指针。由于myArray是第一个元素的地址,即int[5],我们的声明很好。

然而,当您取消引用此指针时,您将获得第一个元素,即数组。因此,您可以执行以下操作:

(*arrayptr)[3]; // parens necessary for precedence issues

访问嵌套在“外部数组”的第一个元素内的数组中的第3个元素。 它相当于

myArray[0][3];

正在发生的事情是你解除引用arrayptr会产生一维数组(在这种情况下大小为5)..然后你要求这个1D数组的第4个元素。

现在,如果你要找的是矩阵的左上角,你会想要:

int *topleft = &(myArray[0][0]);

答案 3 :(得分:0)

使用地址运算符指向base的偏移量。

char base[2][2];
int *basepointer = &base;

答案 4 :(得分:0)

我想特别回答你的问题。

每当您传递2D数组的名称时,该数组的名称将被衰减为指向第一个元素的指针,

在多维数组中,由于多维数组是数组数组,因此第一个元素将是数组本身。

因此,2D数组的名称将衰减为指向数组的指针,即指向第一行的指针,其中元素的数量等于2D数组中的列数。

记住在函数中接收2D数组作为指向数组的指针而不是指向指针的指针。

this.refs.childRef.getState();