我试图理解用于存储变量和指针的地址大小,指针指针和指针指针指针。结果有点令人困惑。
以下是代码:
#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输出
答案 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
&ptr
是T***
上的地址/指针,因此它的大小也是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位(或更多)操作系统。