引用和指针都存储地址?

时间:2014-04-11 16:42:28

标签: c++ pointers reference

int* var&var是否都存储了地址,唯一的区别是你必须尊重int*才能获得价值,但是没有引用已经这样做了?无法彻底了解这些。

为什么当你有一个函数接受int *参数时你可以通过&

传递值

7 个答案:

答案 0 :(得分:3)

它们是表达可能最终归结为同一事物的不同方式。它们都是由语言设计者发明的构造,这意味着编译器的作者必须以他们认为适合底层机器的任何方式实现它们。

然而,仅仅因为它们在机器上代表相同的东西并不意味着它们是等价的。指针允许指向无任何指针(NULL指针)的概念,并且还允许执行数学运算以获得从起始位置索引的一部分内存......如下所示:

int *x = new int [10];
*(x+2) = 5; //set the 3rd element of the array pointed to by 'x' to 5

非常明智。

参考文献没有关于此类事物的概念,即可以做到

int *x = new int[10];
*(x+2) = 5;
int &y = *(x+2);

但不是

int *x = new int[10];
*(x+2) = 5;
int &y = *(x+2);
y = y + 5;//this just changes the value of x[2]

这意味着由于错误的指针数学而更难写出结构的结尾,所以如果将它们初始化为有意义的东西(即不是从声明它们的函数返回的话)它们会更安全堆栈或不存在的数组元素

int &dontdoit() {
  //don't do this!
  int x = 7;
  int &y = x;
  return y;
}

我认为这是完全合法和安全的,因为你不会破坏记忆,但不建议你混合习语,而你无法释放分配的内存:

int &dontdothiseither() {
  int *x = new int;
  int &y = *x;
  return y;
}

此外,您可以根据需要多次设置指针,但不能设置参考。

int x[2];
int *y = x;//works
y = y+1; //works, now points to x[1];
int &z = x[0]; //works
z = x[1];//nope! This just sets x[0] to be the value in x[1]

答案 1 :(得分:2)

int*是一个变量,其值是某些int的地址。 &var不是参考。一元&运算符只返回var的地址。这就是为什么如果你有一个带有int*类型参数的函数,你在调用站点使用&var

由于C ++使用&来表示""的地址,因此有点令人困惑。和"引用",但上下文使它们与众不同。

int a = 5;
int& ref = a; // Now ref and a both mean the same thing.

VS

int b = 6;
int* ptr = &b; // Now ptr POINTS to b, but they are not the same thing. 

答案 2 :(得分:2)

不不不! 引用成为该变量的昵称,其中指针存储变量的地址。 假设我们有一个int类型的变量:

    int x;

    int &y=x; // now y is an other name of x

    int *p=&x; // here p is a pointer, which points to x

答案 3 :(得分:1)

是的,指针和引用都存储地址,并编译为完全相同的代码。唯一的主要区别是引用不能为null,而指针可以 - 因此是众所周知的“空指针”。显然,程序员以不同的方式访问它们:分别使用->.,但这实际上没有意义。

答案 4 :(得分:1)

是的,在内部传递一个指向T的指针并将引用传递给T在任何已知的合理实现中是相同的,引用是指针的语义糖,它总是被解引用而不能是NULL
虽然实现没有义务。

优化后,甚至可以确定函数内部使用的引用。

但是,它们会导致不同的方法/对象签名 此外,它们对读者来说具有不同的语义负荷。

答案 5 :(得分:1)

您可以将引用视为变量的新“名称”,而指针是存储地址的变量。

实际上,可以使用指针实现引用(因此,它可能存储地址),但您不必担心这一点。

例如:

int i;
int *pointer = &i;           //Holds address of i
int& reference = i;          //reference is a new name of i
int *pointer2 = &reference;  //pointer2 holds the address of i

答案 6 :(得分:0)

&字符在C ++中用于许多不同的目的。其中两个看起来可能相似,但他们并非如此。

首先是创建一个引用:

int a = 1;
int &b = a;

现在ab都引用相同的变量,对其中一项所做的更改将反映在另一项中。

另一种用法是创建一个指针:

int *p = &a;

这与引用完全没有关系。 &被用作地址运算符,获取变量并创建指向它的指针。