用二维数组的名称分配和打印指针值时出现意外结果

问题描述 投票:0回答:1

根据我对二维数组的理解,假设我声明

int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
,它将按照准确的顺序存储在内存中。

而每一行的地址可以这样写:

a[0]
等于
&a[0][0]
a[1]
等于
&a[1][0]
a[2]
等于
&a[2][0]
。所以每个
a[n]
都是一个
int*
类型变量。

并且由于数组名称

a
最初是
&a[0]
,因此它将是一个
int**
类型变量。

根据这些知识,我认为编写这样的代码在将

a
分配给
p
时会发生错误,因为类型不同。

#include <stdio.h>

int main() {
    int a[3][3] = { 72, 4, 5,
                   6, 7, 8,
                   9, 10, 11 };

    int* p;
    p = a;    //possible error, from int** to int*

    printf("*p : %d\n", *p);
    return 0;
}

但结果不知何故显示了

a[0][0]
的值,即 72。这里发生了什么?我对二维矩阵的理解有问题吗?

arrays c pointers multidimensional-array integer
1个回答
0
投票

由于数组名a原本是&a[0],所以它将是一个int**类型 变量。

你错了。表达式中使用的数组(极少数例外)确实会转换为指向其第一个元素的指针。但在这种情况下,数组元素的类型是

int[3]
。因此表达式中使用的数组
a
被转换为
int ( * )[3]
类型的指针。

至于这个代码片段

int* p;
p = a;    //possible error, from int** to int*

printf("*p : %d\n", *p);

那么它有未定义的行为。尝试将指针的值解释为整数。

© www.soinside.com 2019 - 2024. All rights reserved.