2

我有一个指针如下:

int val2 = 90;

int *p = &val2;

然后,我这样做:

int *pp = &p; // Line 3

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

4

4 回答 4

4

int *pp定义pp为指向 an 的指针int,但您尝试使用指向 an 的指针的int地址而不是a 的地址对其进行初始化int。由于“int 的地址”和“int 指针的地址”的类型不同,编译器不会让你这样做(至少没有强制转换,尽管你几乎肯定不想这样做去做)。

是的,这两种类型的指针可能大小相同,因此 CPU 可以将数据从一个位置移动到另一个位置,而不会出现任何实际问题。然而,编译器会进行类型检查以帮助您避免误伤自己,这就是它在这里所做的。它可以让你用上面提到的演员表做你所要求的事情,但是由于你所做的事情几乎没有意义,如果你真的坚持这样做,你需要使用演员表。

于 2012-04-30T15:05:52.600 回答
2

对于静态类型检查器,是的。从实施的角度来看没有。

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

int *pp = &p;

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

于 2012-04-30T15:04:05.743 回答
1

在绝大多数平台上,所有指针在内存中都是一样的:内存中其他地方的地址。问题主要在于尝试类型安全,以便计算机可以强制正确使用。

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

于 2012-04-30T15:06:25.490 回答
1

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

于 2012-04-30T15:06:56.567 回答