1

二维数组的名称是否像一维数组一样在 C 中给出其基地址?以及如何将二维数组的基地址存储在指针变量中?

4

5 回答 5

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

于 2012-06-18T08:59:58.677 回答
2

是的,您将地址存储为:

int *p = &a[0][0];
于 2012-06-18T09:01:45.833 回答
2

二维数组本质上是一维数组,其中每个元素本身都是一个数组。

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

分配指向该地址的指针与往常一样,例如:

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

arrayptr是一个指向 5 个整数数组的指针。因为myArray是第一个元素的地址,也就是int[5],所以我们的声明很好。

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

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

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

myArray[0][3];

发生的事情是您正在取消引用arrayptr,这将产生一个一维数组(在这种情况下大小为 5).. 然后您要求这个一维数组的第 4 个元素。

现在,如果您要查找的是矩阵的左上角“角”,您将需要:

int *topleft = &(myArray[0][0]);
于 2012-06-18T09:02:31.397 回答
0

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

char base[2][2];
int *basepointer = &base;
于 2012-06-18T09:06:57.180 回答
0

I would like to give answer specific to your question.

Whenever you pass name of a 2D Array, that name of array will be decayed into pointer to first element,

In a multi-dimensional array, as multi dimensional array is array of arrays, so first element will be array itself.

So name of 2D array will be decayed to pointer to array, ie pointer to first row having number of elements equal to number of columns in your 2D array.

Remember 2D array is received in a function as pointer to array not pointer to pointer.

    int main()
    {
     int arr[2][3];

     display(arr);
     ............

    }
     void display( int (*arr)[3])
    {

}
于 2018-04-29T13:10:50.020 回答