我所说的那本书数组名是一个指针常量。 所以,我试过这个:
int A[3][4] = {0};
A[0][0] = 1;
A[1][0] = 2;
A[2][0] = 3;
printf("A : %x\n", A);
printf("*A : %x\n", *A);
我预计第一个printf
的结果是A
的地址,另一个是1
。
因为,我认为数组名是一个指针常量,结果将是*(A的地址)。
但是,结果具有相同的价值; A.的地址
你知道为什么吗?请给我一些建议。
答案 0 :(得分:1)
首先,数组不是指针!你的书错了。数组和指针共享一些操作,在某些情况下,数组名称可以自动转换为指向其第一个元素的指针,但请记住它们是不同的。
其次,在您的代码中,A
是一个二维数组,即一个数组数组。所以*A
与A[0]
相同,是它的第一个子阵列。要访问A[0][0]
,您需要**A
。
答案 1 :(得分:1)
数组不是指针。除非它是sizeof
或一元&
运算符的操作数,或者是用于初始化声明中的另一个数组的字符串文字,否则类型为“N”的表达式将T
“的元素数组转换(”衰减“)为”指向T
的指针“的表达式,表达式的值将是数组的第一个元素的地址。
鉴于A
的声明,以下所有内容都是正确的:
Expression Type Decays to Value
---------- ---- --------- -----
A int [3][4] int (*)[4] &A[0][0]
*A int [4] int * &A[0][0]
&A int (*)[3][4] n/a &A[0][0]
A[i] int [4] int * &A[i][0]
*A[i] int n/a A[i][0]
&A[i] int (*)[4] n/a &A[i][0]
A
衰减为“指向int
的4元素数组的指针”类型的表达式。 A[i]
衰减到“int
指针类型的表达式。数组的第一个元素的地址与数组本身的地址相同,因此表达式
A
*A
&A
A[0]
&A[0]
&A[0][0]
所有评估为相同的值,但表达式的类型将不同。
答案 2 :(得分:0)
数组和指针不相同。 主要区别在于您无法对数组名称执行指针递增或递减。您可以将数组视为常量指针。 如果你想打印一个数组的元素,那么在循环中尝试** A或*(A + i),其中i是循环索引
答案 3 :(得分:0)
不要与数组和指针混淆!两者都是不同的东西!并且数组也不是指针!但是数组名称代表数组的基地址!
在您的代码中 -
int A[3][4];
这是一个二维数组,所以你需要两次dererence。如果你有一次取消它只会获取数组的地址。 A
,A[0]
,*A
,&A
,&A[0]
都代表它的起始地址。
尝试 -
printf("%d\n",**A);
或
printf("%d\n",A[0][0]);
或
printf("%d\n",*A[0]);