所以我试图理解指针和参考文献。
假设我们有以下内容:
int val = 100;
int *ip = &val;
为什么这不像简单地指向val那样:
int val = 100;
int *ip = val;
答案 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
,这是不允许的。
请注意,您的代码示例不包含任何引用。