[英]“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.