我想知道sizeof运算符在C中是如何工作的。在下面的代码中我希望得到输出1但是得到4。因为p指向第一个位置而在第一个位置有字符,它的大小应该是1。 / p>
main()
{
char a[9]="amit";
int *p=&a;
printf("%d",sizeof((char *)(*p)));
}
答案 0 :(得分:6)
不,你要求你的实现中的字符指针的大小为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).
答案 1 :(得分:5)
你得到的是演员(char *)
的结果大小,这是一个大小为4的字符*。当然你可以说:
printf( "%d", sizeof(a[0]) );
而且有人想知道你为什么不这样做?
答案 2 :(得分:1)
对于上述问题,答案是4.
在这里,您输入一个指向char指针的整数指针
这意味着现在整数指针正在保持字符
对于sizeof运算符,默认参数为int
当你像sizeof((char *)(*p))
一样传递时,它会被视为sizeof('a')
。这个char a被提升为int。这就是你获得4分的原因。
答案 3 :(得分:0)
是的,在32位系统上,这段代码应该显示 p的大小为4.在16位上它会显示2(这些天在应用程序世界中没有被高度使用,但可以是基于系统的要求在嵌入式世界中使用)。 您已经对char 进行了强制转换,这将影响数据表示,但不会影响指向数据的指针占用的内存。