这个简单的指针程序输出有什么解释

时间:2012-06-30 18:55:10

标签: c pointers

我试图理解用于存储变量和指针的地址大小,指针指针和指针指针指针。结果有点令人困惑。

以下是代码:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main(void)
{
    char    *** ppptr_string = NULL;
    int     *** ppptr_int    = NULL;
    double  *** ppptr_dbl    = NULL;

    char c=0; int i=0; double  d=0;

    printf("\n %d   %d   %d   %d   %d\n", sizeof(&ppptr_string),   
    sizeof(ppptr_string),  sizeof(*ppptr_string), sizeof(**ppptr_string), 
    sizeof(***ppptr_string));
    printf("\n %d   %d   %d   %d   %d\n", sizeof(&ppptr_int),   sizeof(ppptr_int),    
    sizeof(*ppptr_int),   sizeof(**ppptr_int),   sizeof(***ppptr_int));
    printf("\n %d   %d   %d   %d   %d\n", sizeof(&ppptr_dbl),   sizeof(ppptr_dbl),    
    sizeof(*ppptr_dbl),   sizeof(**ppptr_dbl),   sizeof(***ppptr_dbl));


    printf("\n  sizeof(char) = %d,   sizeof(int) = %d,   sizeof(double) = %d", 
    sizeof(c), sizeof(i), sizeof(d));
    printf("\n sizeof(&char) = %d,  sizeof(&int) = %d,  sizeof(&double) = %d", 
    sizeof(&c), sizeof(&i), sizeof(&d));

getch();
return 0;
}
现在混乱了。我可以看到这台机器上的变量地址总是2个字节。无论变量的类型如何,无论其是否为指针变量。但为什么我这里有这么多条目的大小为4?无论类型如何,指针的大小都是4。 &gt;地址&lt;存储变量的大小为2.并且指向的内容的大小取决于类型。

为什么我在sizeof ??

的输出中得到4

我的Borland C ++ 5.02输出 enter image description here

2 个答案:

答案 0 :(得分:3)

如果您的类型为T且指针位于T*** ptr之类的指针上,那么ptr*ptr**ptr就是指针本身。您可能正在使用32位系统(或编译32位应用程序),因此sizeof(ptr) == sizeof(*ptr) == sizeof(**ptr)

--- Program output ---

 4   4   4   4   1

 4   4   4   4   4

 4   4   4   4   8

  sizeof(char) = 1,   sizeof(int) = 4,   sizeof(double) = 8
 sizeof(&char) = 4,  sizeof(&int) = 4,  sizeof(&double) = 4

&ptrT***上的地址/指针,因此它的大小也是4。只有当您将指针取消引用到其最大级别(***ptr)时,才会有实际类型,而不是另一个指针。

答案 1 :(得分:0)

我认为发生的事情是你得到了接近(16位)的局部变量指针,但是声明为*类型的指针是一个远(32位)指针。

在16位英特尔处理器(或“实模式”中的32位处理器)上工作是一个怪癖,例如:在DOS中,你只能访问1 MB的内存(实际上是640 kB)。 far指针的高16位是一段(内存中为64k页),低16位是偏移量。

http://en.wikipedia.org/wiki/Real_mode

http://wiki.answers.com/Q/What_are_near_far_and_huge_pointers_in_C

无法重现此问题的答案者最有可能在32位(或更多)处理器上使用32位(或更多)操作系统。