sizeof运算符在c中的工作方式

问题描述

|| 我想知道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(目前在应用程序世界中使用率不高,但可以在基于以下内容的嵌入式世界中使用:系统的要求)。 您已将字符强制转换为字符,这将影响数据表示形式,但不会影响指向数据的指针所占用的内存。