指向指针的指针输入的函数

lim*_*ess 8 c pointers sizeof

我看到了关于结果的这个问题 sizeof(),我不理解这个函数的输出.

#include <stdio.h>
void checkSizes(char matrix3d[10][20][30])
{
    printf ("%lu\t", sizeof(matrix3d));
    printf ("%lu\t", sizeof(*matrix3d));
    printf ("%lu\t", sizeof(**matrix3d));
    printf ("%lu\t", sizeof(***matrix3d));
}
int main()
{
    char matrix[10][20][30];
    checkSizes(matrix);
}
Run Code Online (Sandbox Code Playgroud)

正如我所假设的,当一个函数得到一个数组工作时,它得到一个指向数组的指针,所以当我打印第一行

printf ("%lu\n", sizeof(matrix3d));
Run Code Online (Sandbox Code Playgroud)

输出将是8.

但是不是下一个printf会让我指向指针的不同指针,他的大小也会是8吗?

所以我会这会导致

8    8    8    1
Run Code Online (Sandbox Code Playgroud)

真正的输出是

8    600    30   1
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 2

在这份声明中

printf ("%lu\t", sizeof(*matrix3d));
// it is better to use "%zu\t"
Run Code Online (Sandbox Code Playgroud)

表达式*matrix3d具有类型char[20][30]

在运算符中使用数组sizeof作为表达式不会将表达式转换为指向数组第一个元素的指针。

这样你就会得到输出600

但是如果你会写

sizeof( *matrix3d + 0)
Run Code Online (Sandbox Code Playgroud)

那么确实*matrix3d有 typechar[20][30]会在表达式中*matrix3d + 0隐式转换为 type 的指针char ( * )[30],相应的printf语句将输出 8,

至于函数参数及其实参则隐式转换为类型char ( * )[20][30]

例如这些函数声明是等价的

void checkSizes(char matrix3d[10][20][30]);
void checkSizes(char ( *matrix3d )[20][30]);
Run Code Online (Sandbox Code Playgroud)

并声明相同的函数。