Aci*_*dic 0 c++ pointers reference
我在多个来源中读到,C++引用只不过是一个带有编译时间限制的指针.
如果这是真的,为什么我被迫取消引用一个指针,以便将它传递给一个需要参数的函数?
void FooRef(const int&);
void FooPointer(const int*);
int main()
{
int* p = new int(5);
FooPointer(p);
FooRef(*p); // why do I have to dereference the pointer?
...
}
Run Code Online (Sandbox Code Playgroud)
据我了解,如果我要传递int
给FooRef
编译器将为我创建变量地址的指针(引用),但如果该类型已经是指针,那么解除引用它似乎毫无意义.在我看来,我正在取消引用一个指针,只是为了让编译器从取消引用的值创建另一个指针,这对我来说似乎毫无意义.
仅复制指针而不仅仅是引用+引用该值是不是更简单/更高效?(也许这真的发生了什么?)
我在这里错过了什么吗?调用FooRef
这种情况比调用慢FooPointer
吗?
在编译期间,引用和指针是否真的产生相同的代码?
参考可以在引擎盖下的指针实现的事实是无关紧要的.许多编程概念可以根据其他事情来实现.您也可以问为什么我们有while
循环时while
可以用goto
或实现jmp
.不同语言概念的要点是让程序员更容易,而引用是为方便程序员而设计的语言概念.
你可能误解了引用的目的.引用为你提供指针的正面(便宜传递),但由于它们具有与常规值相同的语义,它们消除了使用指针带来的许多危险:(指针算术,悬空指针等)更多重要的是,一个参考是一个完全不同的类型比在C++型系统中的指针,这将是疯狂,以允许所述两个可以互换(即会破坏引用的目的.)
引用语法的目的是为了镜像常规值语义的语法 - 同时为您提供廉价传递内存地址而不是复制整个值的能力.
现在,转到你的例子:
FooRef(*p); // why do I have to dereference the pointer?
Run Code Online (Sandbox Code Playgroud)
你必须取消引用此指针,因为FooRef
需要引用到int
,而不是一个参考int*
.请注意,您还可以引用指针:
void FooPointerRef(const int*&);
Run Code Online (Sandbox Code Playgroud)
引用指针的函数使您可以从函数内修改指针的内存地址.在您的示例中,您必须显式取消引用镜像值语义的指针.否则,查看函数调用FooRef(p)
的人会认为FooRef
要么是逐个值,要么是逐个引用 - 而不是(非指针)值或引用.