C – SizeOf指针
char c[] = {'a','b','c'}; int* p = &c[0]; printf("%i\n", sizeof(*p)); //Prints out 4 printf("%i\n", sizeof(*c)); //Prints out 1
我对这部分代码非常困惑。 p和c都表示第0个索引处的数组c的地址。 但是为什么sizeof(* p)打印4? 不应该是1吗?
因为p
的类型是int *
,所以*p
是int
类型,在你的实现上显然是4个字节宽。
如果您不希望程序调用未定义的行为,请使用%zu
打印size_t
(产量sizeof
)。
sizeof(*p)
是p
指向的int
对象的大小。
sizeof(* p)将打印p的大小,因为int是4,但c是char,这就是为什么它是1
在C(不是C99)中, sizeof
运算符严格地是编译时计算。 因此,当评估sizeof (*p)
[取消引用的ptr到整数]时, int
的大小为4。
注意。 该陈述的(*p)
部分是“强制转换”运算符。 因此,sizeof不是sizeof(xyz)
的函数调用,而是像sizeof var_name
或sizeof (int *)
。
当程序运行时,它会更改p指向的对象,但sizeof (*p)
的值已经计算并硬编码到可执行加载模块中。
我认为你的困惑在于你认为C会找出程序运行时p指向的数据类型。