需要帮助来理解单行c代码输出

时间:2013-09-15 18:10:36

标签: c

请考虑以下代码

#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所有三个都给出相同的位置?

2 个答案:

答案 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}}。