C-指针大小

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字节宽 如果您不想让程序调用未定义的

我对这段代码感到非常困惑。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字节宽


如果您不想让程序调用未定义的行为,请使用
%zu
打印
size\t
(即
sizeof
产生的内容)。

sizeof(*p)将打印p的大小,p的大小是4,因为int,而c是char,这就是为什么它是1

sizeof(*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