关于char指针,sizeof运算符如何工作?

时间:2015-01-25 14:50:41

标签: c++ c gcc g++

下面是代码(用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?

根据我的知识&cc&"hello"表示相同的内容,即一组字符(即c指向'hello')和{{ 1}}表示单个字符(即*c指向'h')。

那么,为什么*c给出8而不是6?从8的计算结果来看?

3 个答案:

答案 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)

那些远非相同:

  1. &#34;你好&#34;是一个由六个字符组成的数组。
  2. c是一个指针(指向char)。
  3. &amp; c也是指针(指针)。
  4. &安培;&#34;你好&#34;是一个指针(指向六个字符的数组)。
  5. 在某些情况下,这些行为相同,因为在某些用例中char数组会衰减为char指针。但是,这是一种转换,它并没有改变它们的含义!