问题描述
||
我想知道sizeof运算符如何在C中工作。在下面的代码中,我期望得到输出1但得到4。
main()
{
char a[9]=\"amit\";
int *p=&a;
printf(\"%d\",sizeof((char *)(*p)));
}
解决方法
不,您要查询的字符指针的大小在您的实现中为4。
那是因为您要将解引用的
int
指针p
转换为char
指针,然后要求它的大小。
分解:
sizeof((char *)(*p))
| \\__/
| \\_ Dereference p to get an int.
\\___________/
\\_____ Convert that to a char * (size = 4).
如果要处理int
的第一个字符(毕竟毕竟是您已转换的字符数组),则应使用:
sizeof(*((char*)(p)))
那是int
指针,转换回char
指针,然后取消引用。
分解:
sizeof(*((char *)(p)))
| \\________/
| \\_ Get a char * from p (an int *)
\\___________/
\\_____ Dereference that to get a char (size = 1).
, 您将获得强制转换(char *)
的结果的大小,即大小为4的char *。当然,您可以说:
printf( \"%d\",sizeof(a[0]) );
而一个人却想知道为什么不这样做?
, 对于上述问题,答案为4。
在这里,您将类型转换为整数指针,并将其转换为char指针。
这意味着现在整数指针正在保存字符。
对于sizeof运算符,默认参数为int。
当您像sizeof((char *)(*p))
那样经过时,它将被视为sizeof(\'a\')
。该字符a被提升为int。那就是为什么你得到4。
, 是的,在32位系统上,代码段应显示p的大小为4。在16位系统上,代码应显示2(目前在应用程序世界中使用率不高,但可以在基于以下内容的嵌入式世界中使用:系统的要求)。
您已将字符强制转换为字符,这将影响数据表示形式,但不会影响指向数据的指针所占用的内存。