這是我不明白的事情。也許有人可以對此有所了解。
我知道資料操作的標準方法是傳遞對函式的參考并更改函式中的資料。像這樣:
#include <stdio.h>
#include <stdlib.h>
void function2( float *param) {
printf("I've received value %f\n", *param);
(*param) ;
}
int main(void) {
float variable = 111;
function2(&variable);
printf("variable %f\n", variable);
return 0;
}
當使用 (&variable) 呼叫 function2 時,我希望該函式可以更改資料。到目前為止沒有任何問題。
但為什么這也有效?
#include <stdio.h>
#include <stdlib.h>
void function2( float ¶m) {
printf("I've received value %f\n", param);
(param) ;
}
int main(void) {
float variable = 111;
function2(variable);
printf("variable %f\n", variable);
return 0;
}
據我了解,當呼叫 function2(variable) 時,“variable”值的副本會傳遞給函式。但是,“變數”的值在函式呼叫后發生了變化。
在閱讀這樣的代碼時,我永遠不會期望“變數”的資料會發生變化,無論函式內部發生什么。
uj5u.com熱心網友回復:
這個引數的宣告
void function2( float ¶m) {
是不正確的。在 C 中沒有參考。這樣的函式宣告將在存在參考的 C 中有效。
在 C 中,當函式被呼叫時
function2(variable);
不會創建變數的副本。該函式參考main中宣告的原始變數。
uj5u.com熱心網友回復:
變體 1 需要一個指標作為引數。因此,您需要顯式傳入&variable.
變體 2 期望參考作為引數。它們有點像一個指標,它們仍然指向記憶體中的原始位置,但也有一點不同,因為它們在型別方面不僅僅是記憶體中的地址。就像,如果我沒記錯的話,你不能用參考做時髦的指標算術。
如您所見,如果函式需要參考作為引數,編譯器將知道要做什么,而無需顯式創建參考。
此外,如您所見,如果有人呼叫您的函式并且沒想到它會更改原始資料,這可能會帶來令人討厭的驚喜。這就是為什么在干凈的代碼中不會引入意想不到的副作用;如果一個函式與輸入混淆,那應該是它唯一要做的事情,并且應該非常明確。
要最終獲得不改變原始版本的變體,請執行
void function2( float param)
在函式宣告中。沒有*和沒有&。在這種情況下,該函式沒有獲得指標或參考,而只是一個浮點值,它現在將是輸入引數的副本,因此不會更改您的變數。
uj5u.com熱心網友回復:
您發布的代碼無法使用 C 編譯器編譯,因為它不是有效的 C 代碼。與 C 不同,C 中沒有參考資料型別。變數或引數名稱不能以 & 符號開頭。如果您想用 C 語言撰寫,請使用 C 編譯器。最流行的是 GNU C 編譯器 (GCC) https://gcc.gnu.org/,更輕的替代品是 TinyCC,兩者都在最常見的版本中可用分發存盤庫。
uj5u.com熱心網友回復:
您的第一個代碼示例使用指向引數(即地址)的指標。您稱其為“參考”,從理論上講,這并沒有錯。但是因為在 C 中參考是不同的(見下文),所以很少使用這個術語來表示指標。
您的第二個代碼示例確實使用了參考。但這不是 C。參考是 C 功能。這意味著您使用的編譯器接受這一點(并且可能是 C 編譯器)。
C 是 C 的超集,這就是為什么程式看起來是 C 但使用 C 特性的原因。
uj5u.com熱心網友回復:
您發布的代碼無法使用 C 編譯器編譯,因為它不是有效的 C 代碼。與 C 不同,C 中沒有參考資料型別。變數或引數名稱不能以 & 符號開頭。如果您想用 C 撰寫,請使用 C 編譯器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480166.html
上一篇:初始化結構指標會導致分段錯誤
