C++ 编译器如何知道指针的类型 double d=1.1; 双*p=&d; 无法澄清chris post。 当您声明double*p时,您明确地告诉编译器“我正在声明一个指向double的指针”。在编译过程中,编译器会记住,在引用p(遵循范围规则)的代码的每个部
编译器如何知道指针的类型C++ 编译器如何知道指针的类型 double d=1.1; 双*p=&d; 无法澄清chris post。 当您声明double*p时,您明确地告诉编译器“我正在声明一个指向double的指针”。在编译过程中,编译器会记住,在引用p(遵循范围规则)的代码的每个部,c++,pointers,C++,Pointers,编译器如何知道指针的类型 double d=1.1; 双*p=&d; 无法澄清chris post。 当您声明double*p时,您明确地告诉编译器“我正在声明一个指向double的指针”。在编译过程中,编译器会记住,在引用p(遵循范围规则)的代码的每个部分中,p是指向一个双精度的指针,扩展而言,p是指向与双精度大小相同的内存位置的指针。因此,无论在哪里看到p,编译器都知道“p是一个指向大小为double的double的指针”。您在声明指针时告诉了它类型。double*p是指向大小已知的doub
double d=1.1;
双*p=&d;
无法澄清chris post。
当您声明double*p
时,您明确地告诉编译器“我正在声明一个指向double的指针”。在编译过程中,编译器会记住,在引用p
(遵循范围规则)的代码的每个部分中,p
是指向一个双精度的指针,扩展而言,p
是指向与双精度大小相同的内存位置的指针。因此,无论在哪里看到p
,编译器都知道“p
是一个指向大小为double的double的指针”。您在声明指针时告诉了它类型。double*p
是指向大小已知的double
的指针。不要混淆指针的大小和它所指向的类型的大小。我认为过于简单化了。但可能适合OP。我同意这是一种过度简化。但试图写出C/C++编译器如何处理类型和指针可能是一篇多页的文章。当然,我不是一个很好的解释复杂概念的人,因为它很简单。您可以通过尝试输出一个void*p
来确认这种类型的推断。编译器将出错,因为它无法推断要取消引用的内存大小。您必须首先键入指针,以允许编译器取消引用正确的内存大小。这是一个有趣的附录。你可以做一些疯狂的事情,比如long*lp=static\u cast(p)
,即使所说的p
指向的是double
(可能是无意义的结果,除非你做的是快速平方根倒数),Cat
(例如,一个类Cat的实例),或者bool
(祝贺你,你没有读到你现在应该读的部分记忆,你的未来可能会有seg故障。希望你不要写信给它)。有时你必须做一些疯狂的事情,但是…首先要寻找其他选项,配置文件以确保它确实让事情变得更好,并留下大量的咒骂性删除评论警告,解释你做了什么,为什么这么做,以及它在给定平台上是如何工作的。明确说明平台。只要一个编译er的修改可能会使魔术停止工作。
double d = 1.1;
double *p = &d;
cout << *p;
int i = 1;
int * q = &i;
cout << *q;