请考虑以下代码
#include<stdio.h>
int main()
{
int a[2][3][4] = { {1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 1, 2},
{2, 1, 4, 7, 6, 7, 8, 9, 0, 0, 0, 0} };
printf("%u, %u, %u, %u\n", a, *a, **a, ***a);
return 0;
}
如果我没有错误a
指向数组开始的位置。为什么a ,*a ,**a
所有三个都给出相同的位置?
答案 0 :(得分:0)
是的,这是正确的
指向指针的指针是一个变量,就像任何其他变量一样,但它保存变量的地址。该变量恰好是一个指针。
对这个2D数组的引用将具有类型(a*)* = a**
,因此是指向指针的指针。
旁注: - 正如Oli Charlesworth评论您的代码正在调用未定义的行为,因为您使用%u来解释指针。
答案 1 :(得分:0)
C中的指针变量有两个属性:地址和类型。当您在%u
中打印带有printf()
格式代码的指针时,您只能获得该地址。 (正如其他人在此页面上所述,您不应该使用%u
。如果%p
可以使用printf()
,则应使用a[0][0][0]
。
这是一个法律表达:
a
这将索引a
三次。如果int ***a;
类型为“指向整数的指针”,则只能将其索引一次;它实际上是一个三倍间接指针。 (如果你已经声明它为a
它只是一个指向指向整数的指针的指针;因为你将它声明为一个固定大小的数组,C编译器知道指向的数组的大小按int *p = a[0][0];
。)
你可以这样做:
a
索引int **p = a[0];
两次得到的结果是指向int的类型。
但如果没有演员阵容你就不能这样做:
a[0]
这是因为C编译器知道如果你索引4*sizeof(int)
,它需要将索引乘以a[0]
以找到正确的整数地址,因为这是一个固定大小的数组,而最里面的数组大小为4.如果使用强制转换并强制p
进入变量p
,现在如果索引p
,C编译器将假定结果指向指针。它不会,所以你不能真正有用地使用{{1}}。