针对该程序:
#include<stdio.h>
int main(void)
{
int (*a)[2];
int b[5];
printf("sizeof(int) : %zu\n", sizeof(int));
printf("sizeof(int*) : %zu\n", sizeof(int*));
printf("sizeof(b) : %zu\n",sizeof(b));
printf("sizeof((int*)b) : %zu\n",sizeof((int*)b));
printf("sizeof(&b[0]) : %zu\n",sizeof(&b[0]));
printf("sizeof(a) : %zu\n",sizeof(a));
printf("sizeof(a[0]) : %zu\n",sizeof(a[0]));
printf("sizeof(a[1]) : %zu\n",sizeof(a[1]));
return 0;
}
输出结果为:
sizeof(int) : 4 -> Fact 1
sizeof(int*) : 8 -> Fact 2
sizeof(b) : 20 -> Case 1
sizeof((int*)b) : 8 -> Case 2
sizeof(&b[0]) : 8 -> Case 3
sizeof(a) : 8 -> Case 4
sizeof(a[0]) : 8 -> Case 5
sizeof(a[1]) : 8 -> Case 6
问题/观察(按照案例顺序):
Case 1的输出结果为20,是因为b被声明为整数数组即
int[]
吗?根据Fact1确认,总块大小以字节返回。是这样吗?我想是将b强制转换为
int*
使差异产生了。在这里,b被认为是指针。使用Fact2确认了这一点。是对还是错?&b[0]
衰减为指针b。输出与Fact2相符。我预期这里的输出结果为16,但我得到了8作为输出。我得出结论,这是因为
a
毕竟是一个指针,而输出与Fact2相符。我的输出类似于问题2。a[0]
是指针。输出与Fact2相符a[1]
是指针。输出与Fact2相符
请回答这些问题并纠正我如果有任何错误观察。
&b[0]
是一个指针,而不是一个数组。不需要“衰减”。 - chux - Reinstate Monica&b[0]
已经是一个指针了,取地址运算符会给你一个指向b[0]
的指针。如果你将b
作为参数传递,那么它就会衰变成一个指针。 - Some programmer dude