我阅读了很多关于指针和引用的内容,但它们仍然让我感到困惑,但我认为这只是为了更好地理解而进行更多编程的问题,因为我一周前刚开始使用 c++。我一直想知道的一件事是参考如何知道指向哪里?还是对指针的引用?由于引用也必须指向内存中的某个位置,对吗?
我还在stackoverflow上看到,如果可以的话,通常会使用引用。但是,如果我查看 hl2 的源代码,很多时候都会使用指针。最后,你们花了多长时间才对何时使用指针和何时不使用有良好的感觉?
我阅读了很多关于指针和引用的内容,但它们仍然让我感到困惑,但我认为这只是为了更好地理解而进行更多编程的问题,因为我一周前刚开始使用 c++。我一直想知道的一件事是参考如何知道指向哪里?还是对指针的引用?由于引用也必须指向内存中的某个位置,对吗?
我还在stackoverflow上看到,如果可以的话,通常会使用引用。但是,如果我查看 hl2 的源代码,很多时候都会使用指针。最后,你们花了多长时间才对何时使用指针和何时不使用有良好的感觉?
您可以将引用视为无法更改或获取其值的指针。至于它们和指针之间的区别,最大的区别是您可以对指针进行指针数学运算,引用只指向单个对象并且永远不会改变。
出于直觉,如果你将一个大对象传递给一个函数或方法并且不想复制它(我们现在不考虑移动构造函数),你可以只传递一个 const 引用给它。方法内部的语法就像您传递了一个对象而不进行复制,即使您使用的名称仍将引用原始对象。使用引用获得的另一个好处是它们永远不能为空——它们总是会引用某物,即使某物可能会被回收内存。
但是,如果您有一块内存,其中一个接一个地存储了大量对象,您可以使用指向该内存开头的指针,使用它,然后将其递增 1 以获取下一个对象。
引用是变相的指针,它的目标在其生命周期的最开始就被初始化。换句话说:
int a = 2;
int& ra = a;
ra = ra + 2;
相当于
int a = 2;
int* pa = &a;
*pa = *pa + 2;
但是参考版本在语法上更容易,并且从根本上无法引用某些东西null
- 没有空引用,也没有办法ra
“指向”其他东西。
原则上,这类似于询问指针如何知道指向哪里,或者整数如何知道有多大,或者变量名如何知道它是哪个变量。
编写编译器的人选择如何使这些东西按照标准规定的方式运行。一般来说,在细节的深处,一个引用要么“是”一个变量名,要么“是”一个指针,这取决于它是如何初始化的。
所以,如果你写:
int a = 1;
int &b = a;
然后编译器实际上可能会在其符号表中注明在此范围内,b
并且a
是同一对象的两个名称。
如果你写:
void foo(int &a) { a = 1; }
然后,编译器使用的调用约定可能会规定该函数的参数传递与带指针的函数完全相同。一旦有了参数,函数对参数的作用就略有不同。
当然,在后一种情况下,就程序员而言,这并不意味着引用“是”一个指针。只是编译器编写者在某处使用指针来表示引用。
引用只是变量或对象的别名。它“引用”它以供参考的变量/对象。
int a = 5;
int &x = a;
x 和 a 指的是同一个变量。