为什么指针不能存储另一个指针的地址?

时间:2012-04-30 15:02:49

标签: visual-c++ pointers

我有一个指针如下:

int val2 = 90;

int *p = &val2;

然后,我这样做:

int *pp = &p; // Line 3

Line 3是非法的。我知道应该写int **pp = &p,但我不明白为什么。这是普通变量的地址与指针的地址不同吗?

4 个答案:

答案 0 :(得分:4)

int *pppp定义为指向int的指针,但您尝试使用指向int的地址而不是地址对其进行初始化一个int。由于“int的地址”和“指向int的指针的地址”不具有相同的类型,编译器不会让你这样做(至少没有演员,尽管你几乎肯定 don' t 想要这样做。)

是的,两种类型的指针可能大小相同,因此CPU可以将数据从一个位置移动到另一个位置而没有任何实际问题。但是,编译器会进行类型检查以帮助您避免自己陷入困境,这就是它在这里所做的事情。它会让你按照上面提到的演员来做你所要求的,但是因为你所做的事情很少或没有意义,如果你真的坚持这样做,你需要使用演员。

答案 1 :(得分:2)

对于static type checker是的。从实施角度来看

由于类型检查必须确保您分配和传递的内容与您声明它的方式相符,因此必须拒绝

int *pp = &p;

因为在尝试存储指向int的指针时,将pp声明为指向int的指针。即使指针指向某个东西或其他指针之间没有区别,如果您将其声明为特定类型,则检查的类型也会有所不同。

答案 2 :(得分:1)

在绝大多数平台上,所有指针在内存中都是相同的:内存中其他地址。问题主要在于尝试保持类型安全,因此计算机可以强制执行正确的用法。

如果需要将它们存储为错误类型,则可以始终在不同指针类型之间进行类型转换。

答案 3 :(得分:1)

您正在创建指向整数的指针,因此编译器希望您指定整数的地址。相反,您要分配指针的地址,而不是整数。为了让编译器知道在哪里查找int,你必须添加第二个星号,告诉编译器pp指向一个内存地址,然后指向一个int。