下面是代码(用gcc编译):
#include <stdio.h>
#include<string.h>
int main()
{
char *c="hello";
printf("1) sizeof 'hello' : %d \n",sizeof("hello"));
printf("2) sizeof '*c' : %d \n",sizeof(*c));
printf("3) sizeof 'c': %d \n",sizeof(c));
printf("4) sizeof '&c' : %d \n",sizeof(&c));
printf("5) sizeof '&hello': %d \n",sizeof(&("hello")));
printf("\n");
return 0;
}
给定程序的输出:
1) sizeof 'hello' : 6
2) sizeof '*c' : 1
3) sizeof 'c': 8
4) sizeof '&c' : 8
5) sizeof '&hello': 8
因此,对于案例1)和2),为什么这个输出没有问题。
但对于其余的情况,即3),4)和5),为什么sizeof
运算符给出8?
根据我的知识&c
,c
和&"hello"
表示相同的内容,即一组字符(即c
指向'hello')和{{ 1}}表示单个字符(即*c
指向'h')。
那么,为什么*c
给出8而不是6?从8的计算结果来看?
答案 0 :(得分:6)
sizeof
只检查参数的类型,而不是它的值
"hello"
是char const[6]
类型的左值。数组对象的大小就是元素的大小乘以绑定的大小。 char
的大小定义为1,因此sizeof *c
为1,sizeof "hello"
为6 * 1 = 6.
指针通常大4或8个字节 - 在您的平台上它是8个,如值的所示
sizeof c
。
sizeof (&c)
和sizeof(&("hello"))
为您提供与sizeof c
相同的输出。再一次,只是一个指针的大小。
答案 1 :(得分:2)
c
是指向char
的指针。 64位系统上任何指针的大小为8个字节。
"hello"
是一个字符数组(实际上是char const[6]
)。这就是sizeof("hello")
为6的原因。
当您编写c = "hello";
时,数组"hello"
会衰减到指向其第一个元素的指针。
答案 2 :(得分:1)
那些远非相同:
在某些情况下,这些行为相同,因为在某些用例中char数组会衰减为char指针。但是,这是一种转换,它并没有改变它们的含义!