解释GCC中整数,字符和浮点指针大小的概念

时间:2014-03-25 13:54:23

标签: pointers gcc

在GCC中(Ubuntu 12 .04)以下代码是我需要理解的整数,字符和浮点指针大小概念的程序。

    #include<stdio.h>
    main()
    {
         int i=20,*p;
         char ch='a',*cp;
         float f=22.3,*fp;
         printf("%d %d %d\n",sizeof(p),sizeof(cp),sizeof(fp));
         printf("%d %d %d\n",sizeof(*p),sizeof(*cp),sizeof(*fp));
     }

当我在&#34; UBUNTU 12.04&#34;中运行上述代码时,我得到以下输出 输出:

    8 8 8
    4 1 4

按照这一行,&#34;无论数据类型如何,地址指针的大小都允许4个字节BY DEFAULT&#34; 那么得到sizeof(p)= 8背后的原因是什么呢?它应该是sizeof(p)= 4 .... 请解释一下。

3 个答案:

答案 0 :(得分:4)

sizeof(x)将返回x的大小。指针与任何其他变量一样,只不过它包含一个地址。在64位机器上,指针需要64位或8个字节,这就是sizeof将返回的内容。你机器上的所有指针都是8个字节长,无论指向的是什么数据。

他们指向的数据可能有不同的长度。

int x = 5; // x is a 32 bit int, takes up 4 bytes
int *y = &x; // y holds the address of x, & is 8 bytes
float *z; // z holds the address of a float, and an address is still 8 bytes long

你可能会感到困惑,因为你以前在32位计算机上做过这件事。你看,32/64位表示机器地址的大小。因此,在32位计算机上,指针保存最多32位长的地址,或4个字节。您当前的机器必须是64位机器,这就是指针需要8个字节长的原因。

详细了解此here

哎呀,这不仅仅是地址长度。其他数据类型的大小也取决于平台和实现。例如,int在一个平台上可以是16位&amp;另一个是32位。第三种实现方式可能会变得疯狂并且具有128位整数。规范中唯一的保证是int的长度至少为16位。如有疑问,请随时查看。 C数据类型的Wikipedia页面会有所帮助。

答案 1 :(得分:0)

sizeof(p)将返回地址,您最有可能在64位计算机上运行,​​因此您的地址将为(8*8)64位长度。

p的值解除引用的大小为32位整数(4*8)

您可以通过查看全部来验证这一点:

  • 所有指针都以sizeof为8
  • 您的char值为1(典型的c的许多实现)
  • 打印p*p(适用于所有变量)。你会以这种方式看到实际的地址长度。

答案 2 :(得分:0)

我不确定你正在使用哪些文档,但我的猜测是他们正在讨论32位指针。 在64位中,指针的大小变为8字节