C-指针大小
我对这段代码感到非常困惑。p和c都表示第0个索引处数组c的地址。但是为什么sizeof(*p)打印出4?它不应该是1吗?C-指针大小,c,arrays,pointers,character,sizeof,C,Arrays,Pointers,Character,Sizeof,我对这段代码感到非常困惑。p和c都表示第0个索引处数组c的地址。但是为什么sizeof(*p)打印出4?它不应该是1吗?sizeof(*p)是p指向的int对象的大小。sizeof(*p)是p指向的int对象的大小。因为p是int*/code>类型,所以*p是类型,这在您的实现中显然是4个字节宽 如果您不想让程序调用未定义的行为,请使用%zu打印size\u t(即sizeof产生的大小)。因为p类型为int*,所以*p类型为int,这在您的实现中显然是4字节宽 如果您不想让程序调用未定义的
sizeof(*p)
是p
指向的int
对象的大小。sizeof(*p)
是p
指向的int
对象的大小。因为p
是int*/code>类型,所以*p
是类型,这在您的实现中显然是4个字节宽
如果您不想让程序调用未定义的行为,请使用%zu
打印size\u t
(即sizeof
产生的大小)。因为p
类型为int*
,所以*p
类型为int
,这在您的实现中显然是4字节宽
如果您不想让程序调用未定义的行为,请使用%zu
打印size\t
(即sizeof
产生的内容)。sizeof(*p)将打印p的大小,p的大小是4,因为int,而c是char,这就是为什么它是1sizeof(*p)将打印p的大小,因为int是4,但是c是char,这就是为什么在c(不是C99)中它是1的原因。sizeof
操作符严格来说是编译时计算。因此,当计算sizeof(*p)
[将ptr解引用为整数]时,int
的大小为四
注意。该语句的(*p)
部分是一个“cast”操作符。因此,sizeof不像sizeof(xyz)
中那样是一个函数调用,而是类似于sizeof var\u name
或sizeof(int*)
当您的程序运行时,它会更改p指向的对象,但是sizeof(*p)
的值已经计算出来并硬编码到您的可执行加载模块中
我认为您的困惑在于,您认为C会在程序运行时找出p所指向的数据类型。在C(而不是C99)中,sizeof
运算符严格来说是编译时计算。因此,当计算sizeof(*p)
[将ptr解引用为整数]时,int
的大小为四
注意。该语句的(*p)
部分是一个“cast”操作符。因此,sizeof不像sizeof(xyz)
中那样是一个函数调用,而是类似于sizeof var\u name
或sizeof(int*)
当您的程序运行时,它会更改p指向的对象,但是sizeof(*p)
的值已经计算出来并硬编码到您的可执行加载模块中
我认为您的困惑在于,您认为C会在程序运行时找出p所指向的数据类型。或转换为int
,如果您的实现(cougMicrosoftcough)不支持“%zu”
@KeithThompson-Yup:),则使用“%d”
或“%I”
)(MS必须从21世纪开始,至少支持C99…)或者,更好的是,转换成无符号long
并使用%lu
@KeithThompson为什么int p
指针接受char
的地址。这段代码int*p=&c[0]
。我认为只有void*
指针可以接受任何type@CholthiPaulTtiopic:没有。给定字符c[10]
,gcc警告从不兼容的指针类型初始化或转换为int
,如果您的实现(cougMicrosoftcough)不支持“%zu”
@KeithThompson-Yup:)(MS必须从21世纪开始,至少支持C99…)或者,更好的方法是,转换成无符号长字符,并使用%lu”
@KeithThompson为什么int p
指针接受字符的地址。这段代码int*p=&c[0]
。我认为只有void*
指针可以接受任何type@CholthiPaulTtiopic:没有。给定字符c[10]
,gcc警告从不兼容的指针类型初始化
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