簡體   English   中英

“ foo(int *指針)” vs.“ foo(int *&pointer)”

[英]“foo(int* pointer)” vs. “foo(int* &pointer)”

我是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;是什么pointer = &foo; test1做什么?

C ++有兩種將值傳遞給函數的一般方法-傳遞值(如void foo(int i)和傳遞引用(如void foo(int &i) 傳遞值會復制傳入的值,而傳遞引用會將引用綁定到傳入的值。因此,使用傳遞值的函數無法修改原始值,因為該函數只有一個副本,而按引用傳遞提供了一種通過引用修改原始值的方法。

對於test1 ,您正在做的是按值傳遞指針類型的值。 調用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讀取的嘗試都會產生所謂的“未定義行為”-基本上,計算機可能已經重用了曾經用於在test2執行期間存儲foo ,如果嘗試從p讀取,可能會得到一些非常奇怪的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM