根据我对二维数组的理解,假设我声明
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。这里发生了什么?我对二维矩阵的理解有问题吗?
由于数组名a原本是&a[0],所以它将是一个int**类型 变量。
你错了。表达式中使用的数组(极少数例外)确实会转换为指向其第一个元素的指针。但在这种情况下,数组元素的类型是
int[3]
。因此表达式中使用的数组a
被转换为int ( * )[3]
类型的指针。
至于这个代码片段
int* p;
p = a; //possible error, from int** to int*
printf("*p : %d\n", *p);
那么它有未定义的行为。尝试将指针的值解释为整数。