" foo(int * pointer)" vs." foo(int *& pointer)"

时间:2017-04-30 23:52:00

标签: c++ pointers

我是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行代码是什么?

1 个答案:

答案 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读取,则可能会获得一些非常奇怪的值