c 函式的引數傳遞

2021-08-19 20:13:58 字數 1893 閱讀 8684

搜 「函式的引數傳遞」, 很多時候看到的是函式的三種傳遞方式~~~

那麼這三種引數傳遞方式有沒有什麼共同點呢?或者說它們的實質到底是怎樣的呢?

(1)、寫乙個帶有引數的函式

返回值型別 函式名(形參列表)
那麼形參列表怎麼寫呢?

其實我們可以按照  定義乙個變數的寫法  來寫形參列表,什麼意思呢?

定義乙個int型變數**為 int a; (或者int a=2;) ; 那麼在形參列表裡邊可以寫 int a

定義乙個char型變數**為 char b;(或者char b='s';); 那麼在形參列表裡邊可以寫 char b

定義乙個指標變數**為 int *p;那麼我們在形參列表裡邊可以寫 int *p

定義乙個引用變數**為 int &d=a; 那麼我們在形參列表裡邊可以寫  int &d

大家有沒有發現什麼規律呢?

那就是寫形參列表的時候,只要寫出  相對應的定義**的等號「=」  之前的部分就好了~~~~~

或許大家不禁要問 這樣寫對不對呢?有依據嗎?

下面來解釋一下~~~~~

(2)、引數傳遞的實質

我們知道函式的引數列表是用來接收外部送來的資訊的,可以理解為接受輸入

void test1(int a, int *p, int &d)

int main();

int *pp=arrayp;

int &dd=aa;

test1(aa, pp, dd);//呼叫函式test1

return 0;

}

在呼叫函式(main(實參列表)) 呼叫 被呼叫函式(test1(形參列表)) 的時候,要進行引數傳遞,這個過程的進行其實就是乙個定義以及賦值~~~

其實執行的是下邊的語句:

int a=aa; //系統為 a 分配空間,將 aa 的值賦值給a

int *p=pp; //系統為 p 分配空間,將 pp 的值賦值給p 

int &d=dd; //系統不為 d 分配空間,給 dd 所代表的空間取了另乙個名字 d,d 的值 和 dd 的值是乙個實體

可以理解為 形參是定義語句中等號之前的部分,函式被呼叫的時候 實參 是等號之後的部分,呼叫的時候進行了定義和賦值操作,形參=實參~~~~~

現在有沒有理解了 形參的寫法呢?

現在來想一想下邊的問題,我們在 test1 **裡:

修改 a 的值,會改變 aa 的值嗎?不會,因為 a 和 aa 代表的是不同的空間呀~~~~~

修改 p 的值,會改變 pp 的值嗎?不會,因為 p 和 pp 代表的是不同的空間呀~~~~~

在不修改 p 值的情況下,修改 *p 的值,會改變 *pp 的值嗎?會的,因為 p 和 pp 是相同的位址,指向的是同乙個空間呀,只要改變了這個空間中的內容,這個內容就變了~~~~~

修改 d 的值,會改變 dd 的值嗎?會的,因為 d 和 dd 代表的是一樣的東西,不管通過哪個名字(d 或者是 dd)將這個東西改變了,那這個東西就變了~~~~~

陣列的形參寫法有兩種,一種是 int array(或者是 int array[常量] ), 另一種是 int *array。可以參考c++定義乙個陣列一定要給出長度嗎?

其實定義陣列有兩種定義方式,靜態和動態:

int array[10]=;//靜態定義方式

int array=;//靜態定義方式

int num=10;

int * array=new int[num];//動態定義方式,num可以為變數,可以為常量

所以陣列在形參列表中的寫法可以有兩種,一種靜態寫法,一種是動態寫法~~~~~

(只不過 如果套用上邊的 「形參=實參」,得到的是int array=arrayarray; 這個寫法是不正確的,但是可以不必再想太多,在形參列表裡寫 定義變數語句等號左邊的內容就好了~~~~~)

C 函式的引數傳遞

一 函式未被呼叫前,函式的形參並不占有實際的記憶體空間,也沒有被賦值。只有在被呼叫的時候,才被賦值。函式引數傳遞指的就是形參和實參想結合的過程。二 函式引數傳遞存在兩種形式 1 值傳遞 即函式在發生呼叫時,給形參分配記憶體空間,直接以實參的值初始化形參。函式被賦值後,實參和形參即沒有關係,形參的改變...

C 函式的引數傳遞

所有的函式都使用 在程式執行棧中分配的儲存區。該儲存區一直保持與該函式相關聯,直到函式結束為止。那時,儲存區將自動釋放以便重新使用。該函式的整個儲存區稱為活動記錄。系統在函式的活動記錄中為函式的每個引數都提供了儲存區,引數的儲存長度由它的型別來決定。引數傳遞是指用函式呼叫的實參值來初始化函式引數儲存...

c 函式引數傳遞

void reset int num void creset const int num void preset int p void cpreset const int p void rreset int arr 10 void initiaresert initializer listlist ...