指向C ++中的引用

时间:2016-03-05 12:13:07

标签: c++ pointers reference

所以我试图理解指针和参考文献。

假设我们有以下内容:

int val = 100;
int *ip = &val;

为什么这不像简单地指向val那样:

int val = 100;
int *ip = val;

4 个答案:

答案 0 :(得分:3)

两个示例中没有一个包含指向引用的指针:

  • 第一个示例有一个指向int的指针,使用地址 - 运算符&正确初始化
  • 第二个示例指向int,未正确初始化为val本身的

通常,您不直接为指针赋值:通常,您需要一个地址运算符,一个隐式指针转换或一些指针算术。虽然也可以在特定硬件上分配一个众所周知的地址,但编译器工具链通常提供了将其保留在程序之外的方法。因此,如果您看到作业int *ip = 100,那几乎肯定是错误的。

如果您想要参考,请按以下方式声明:

int val = 100;
int &ref = val;

现在你可以创建一个指向该引用的指针,如下所示:

int *ipRef = &ref;

由于ref代表val的别名,ipRef与您的示例(demo)中的ip具有相同的值。

答案 1 :(得分:3)

如果你自己这样做,很容易理解他们为什么不一样。

int val = 100;
cout<<val<<endl;

你应该 100 作为输出。

现在尝试:

int val = 100;
cout<<&val<<endl;

你应该得到一个 0x7ffc201cab0c 或与outout类似的东西。 如果您使用“&amp;”访问val ,则表示您正在访问其内存地址。

如果您访问val 而不“&amp;”,则表示您正在访问该值。

因此,如果你这样做

int val = 100;
int *ip = val;

你应该得到警告错误但是假设你想看到它编译,这样你就可以弄清楚会发生什么,这就是你应该做的做:

int val = 100;
int *ip;
*ip = val;

与之前的代码相同,但编译除外。您正在创建指针并为指针指定值,而不是为其指定内存地址。该代码有效,但运行时 错误。在为其指定值之前,指针ip未指向任何位置。

为了使其正常工作,您可以:

int val = 100;
int *ip = new int;
*ip = val;

现在,您有一个带有内存地址的指针。该指针的值为val,即100。这是值 NOT 的内存地址。

总而言之,必须初始化指针,否则它将具有未定义的行为甚至崩溃。您可以使用参考符号(&amp; )或new关键字来初始化指针,然后您可以为其指定赋值。

int val = 100;
int *ip = new int; //Create a new pointer and initilize it with a new memory address
*ip = val; //Assign the value from val(100) to the pointer

int val = 100;
int *ip = &val; //Create a new pointer and initialize it by making it point to existing address of **val**


*ip = 200; //change the value in the **memory addresss to **200**

现在 val 也会变为 200

int otherValue = 500;
*ip = otherValue ; //change the value in the **memory address** to 500

现在 val 也会变为 500

更改内容正在指向的内容地址

您也可以随时更改内存地址。 让我们指向otherValue。

*ip = &otherValue; //Point p to otherValue memory address not value
*ip = 5; //Change the value of p to 5(no memory address change) 

现在otherValue 5 作为值。 p指向otherValue 内存地址

答案 2 :(得分:0)

val integer,因此您无法将 int 分配给指向int的指针,因为它不是有效值,您将需要地址(通过&amp;运算符获得)

答案 3 :(得分:0)

因为指针和整数是不同的数据类型。

int *ip = &val;

这会将一个int*与另一个int*初始化(通过获取val的地址获得的值。)

int *ip = val;

这是尝试使用int*初始化int,这是不允许的。

请注意,您的代码示例不包含任何引用。