3

请考虑以下代码

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

4

2 回答 2

0

是的,这是正确的

指向指针的指针是变量,与任何其他变量一样,但它保存变量的地址。该变量恰好是一个指针。

对该二维数组的引用将具有 type (a*)* = a**,因此是指向指针的指针。

附带说明:-正如 Oli Charlesworth 评论的那样,当您使用 %u 解释指针时,您的代码正在调用未定义的行为。

于 2013-09-15T18:14:03.570 回答
0

C 中的指针变量有两个属性:地址和类型。当您使用 中的%u格式代码打印指针时printf(),您只会得到地址。(正如其他人在此页面上所指出的那样,您不应该真正使用%u它。%p如果它可用于您的.,则应该使用它printf()。)

这是一个合法的表达:

a[0][0][0]

这索引a了三倍。如果a有类型“指向整数的指针”,则只能索引一次;它实际上是一个三倍间接指针。(如果您将它声明为int ***a;它只是一个指向一个指向整数的指针的指针;因为您将它声明为一个固定大小的数组,C 编译器知道由 . 指向的数组的大小a。)

你可以这样做:

int *p = a[0][0];

索引a两次给出了一个指向 int 类型的结果。

但是如果没有演员表,你就不能这样做:

int **p = a[0];

这是因为 C 编译器知道,如果您使用 index a[0],它需要将 index 乘以4*sizeof(int)找到正确的整数地址,因为这是一个固定大小的数组,最里面的数组大小是 4。如果您确实使用强制转换和强制a[0]进入变量p,现在如果你索引pC 编译器将假定结果指向一个指针。它不会,所以你不能真正p以有用的方式使用。

于 2013-09-15T18:29:59.163 回答