我是C ++的新手,我试图准确了解指针(*)和引用(&)的工作原理。
在以下代码中:
#include <iostream>
using namespace std;
void test1(int* pointer)
{
int foo = 2;
pointer = &foo;
}
void test2(int* &pointer)
{
int foo = 3;
pointer = &foo;
}
int main()
{
int aux = 1;
int* p = &aux;
test1(p);
cout << *p << ",";
test2(p);
cout << *p << endl;
system("PAUSE");
}
哪个输出1,3
为什么test1
设法更改 p 指向的内存位置,但test1
没有?
由于test1
没有改变 p ,那么pointer = &foo;
上的test1
行代码是什么?
答案 0 :(得分:2)
C ++有两种将值传递给函数的通用方法 - 按void foo(int i)
传递值,按照void foo(int &i)
传递值,并按test1
传递。按值传递会传递传入的值的副本,而传递引用会将引用绑定到传入的值。因此,使用传递的函数value不能修改原始值,因为该函数只有一个副本,而pass-by-reference提供了一种通过引用修改原始值的方法。
在test1(p)
的情况下,您正在做的是按值传递指针类型的值。当您致电int *pointer = p;
int foo = 2;
pointer = &foo;
时,就好像您这样做了:
p
因此,test2
没有变化。
在p
的情况下,您通过引用传递指针类型的值,这会在int *&pointer = p;
int foo = 3;
pointer = &foo;
中产生更改。您实际上可以编写以下内容,它会产生相同的效果:
foo
请注意,您通常不想获取test2
等本地变量的地址,并将其分配给函数外部的内容,就像您在test2(p)
中所做的那样。调用p
的结果是p
指向不再存在的对象,因此任何从foo
读取的尝试都会产生所谓的&#34;未定义的行为& #34; - 基本上,计算机可能已经重用了在test2
执行期间用于存储p
的内存,如果您尝试从origin
读取,则可能会获得一些非常奇怪的值