参考如何知道指向哪里?

时间:2013-10-30 16:10:43

标签: c++

我对指针和引用很感兴趣,但他们仍然让我感到困惑,但我认为这只是为了更好地理解编程问题,因为我刚开始一周前使用c ++。我一直想知道的一件事是参考如何知道指向哪里? 或者它是指针的引用?既然引用也必须指向内存中某处?

我也在stackoverflow上看到,一般情况下你可以使用引用。但是,如果我查看hl2的源代码,很多时候会使用指针。最后,你们需要多长时间才能在使用指针时感觉良好?何时没有?

4 个答案:

答案 0 :(得分:5)

您可以将引用视为无法更改或获取值的指针。至于它们和指针之间的区别,最大的区别在于你可以对指针进行指针数学运算,引用只指向一个对象并且永远不会改变。

有点直觉,如果你将一个大对象传递给一个函数或方法并且不想复制它(我们现在不考虑移动构造函数),你可以只传递一个const引用。即使你正在使用的 name 仍将引用原始对象,方法内部的语法就像你传递一个没有复制的对象一样。使用引用获得的一个额外好处是它们永远不会为空 - 它们总是引用某些内容,即使某些内容可能是回收的内存。

但是,如果你有一块内存,一个接一个地存储了大量的对象,你可以使用一个指向该内存开头的指针,使用它,然后将其递增1以进入下一个对象

答案 1 :(得分:2)

引用是伪装的指针,它的目标在其生命周期的最开始时被初始化。换句话说:

int a = 2;
int& ra = a;

ra = ra + 2;

相当于

int a = 2;
int* pa = &a;

*pa = *pa + 2;

但参考版本在语法上更容易,并且从根本上无法引用null - 没有空引用,并且无法使ra'指向'其他内容

答案 2 :(得分:1)

原则上,这类似于询问指针如何知道指向何处,或者整数如何知道有多大,或者变量名如何知道它是哪个变量。

编写编译器的人选择如何使这些事物的行为符合标准所表达的方式。一般来说,在详细信息的某处,引用“是”是变量名称或“是”指针,具体取决于它的初始化方式。

所以,如果你写:

int a = 1;
int &b = a;

然后,编译器可能会在其符号表中注意到,在此范围内,ba是同一对象的两个名称。

如果你写:

void foo(int &a) { a = 1; }

然后编译器使用的调用约定可能会指示此函数的参数传递与获取指针的函数完全相同。一旦它具有参数,函数对函数的作用略有不同。

在后一种情况下,当然,就程序员而言,并不意味着引用“是”指针。只是编译器 - 编写器在某处使用指针来表示参考。

答案 3 :(得分:0)

引用只是变量或对象的别名。它“引用”变量/对象,以供参考。

int a = 5;
int &x = a;

x和a引用相同的变量。