0

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

这是代码:

#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。存储变量的 >address< 的大小为 2。指向的内容的大小取决于类型。

为什么我在 sizeof 的输出中得到 4s?

我的 Borland C++ 5.02 输出 在此处输入图像描述

4

2 回答 2

3

如果你有一个类型T和一个指针上的指针T*** ptr,那么ptr, *ptr,**ptr本身就是指针。您可能正在使用 32 位系统(或编译 32 位应用程序),所以sizeof(ptr) == sizeof(*ptr) == sizeof(**ptr)

--- 程序输出 ---

 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

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

于 2012-06-30T19:01:31.357 回答
0

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

这是在 16 位 Intel 处理器(或“实模式”下的 32 位处理器)上工作的一个怪癖,例如在 DOS 中,您只能访问 1 MB 内存(实际上是 640 kB)。远指针的高 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 位(或更多)操作系统。

于 2012-06-30T21:47:06.177 回答