我有一個簡單的問題,並希望通過引用傳遞背後的基礎邏輯。通過引用傳遞的不一致性 - 通過引用傳遞的這個簡單示例如何工作?
這裏有一個代碼(姑且稱之爲代碼1):
void fn(int& a)
{
a = 6;
}
int main()
{
int b = 5;
fn(b);
cout << b;
}
這裏的另一個代碼(代碼2):
void fn(int* ptr)
{
*ptr = 6;
}
int main()
{
int b = 5;
fn(&b);
cout << b;
}
,按價值計算碼通(代碼3):
void fn(int a)
{
a = 6;
}
int main()
{
int b = 5;
fn(b);
cout << b;
}
這裏是我的問題。直觀上,我發現在傳遞值(Code3)的同時,這些值被複制,即只需要將自己的值複製到b
。因此,作爲一般規則,我發現傳遞的值總是被複制到被調用的函數(這裏是fn)。即使使用指針代碼(即Code2)Code 2的第一行確保int *ptr = &a;
我不明白這將如何在Code1中工作。說&a = b
是沒有意義的。這是一個例外,還是這符合與上述段落中討論的情況一致的規則?
謝謝!
「,這對代碼1來說(幾乎)是不可能的」這基本上是一種語義上的區別。所有的編譯器都在下面實現引用作爲指針,如果你有像'void fn2(int * a){fn(* a); }',它會編譯這個函數,只是簡單地傳遞地址,而不是「解除引用」。所以*有效*你可以像傳遞一個無效指針那樣容易地傳遞一個無效的引用。一個語言純粹主義者會說無效指針的解引用表達是未定義的行爲,所以之後的任何東西都是沒有意義的。但這只是一個學術技術性問題,對程序員來說是不可見的。 – newacct