关于 "sizeof" C 字符指针数组的问题

Question on "sizeof" char pointer array in C

我有两个字符数组如下:

char *t1[10];
char(*t2)[10];

当使用 sizeof 找到它们的大小时

printf("sizeof(t1): %d\n", sizeof(t1));
printf("sizeof(t2): %d\n", sizeof(t2));

我发现输出是:

sizeof(t1): 80
sizeof(t2): 8

我很困惑为什么我在使用 sizeof 运算符时会得到两个不同的结果。

对于初学者,在输出 size_t

类型的值时,您必须使用转换说明符 zu 而不是 d
printf("sizeof(t1): %zu\n", sizeof(t1));
printf("sizeof(t2): %zu\n", sizeof(t2));

这条记录

char(*t2)[10];

没有声明数组。它是指向数组类型 char[10].

的指针的声明

因此 sizeof( t1 ) 产生数组的大小,而 sizeof( t2 ) 产生指针的大小。

考虑示例声明

char t1[5][10];
char ( *t2 )[10] = t1;

指针t2由数组t1的第一个元素(类型char[10])的地址初始化。即它指向数组的第一个元素t1.

还要考虑下面对printf

的调用
printf("sizeof( *t2 ): %zu\n", sizeof( *t2 ));

调用的输出将是 10

这就是取消引用指针,您将获得 char[10].

类型的一维数组

如果你想获得相同的输出,那么第二个声明应该重写为

char *t1[10];
char *( t2)[10];