我看到了关于结果的这个问题 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)
在这份声明中
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)
并声明相同的函数。