零 目錄
- 一 準備工作
- 實參與形參
- 全局變量
- 非全局變量(或稱局部變量)
- 二 傳輸地址或數值
- 傳輸數值
- 傳輸地址
- 對比
- 三 總代碼
一 準備工作
——講解涉及到的概念將在這個模塊講解。
1 實參與形參
形參:也就是“形式參數”,是在定義函數名和函數體時會用到的參數,目的是用來接收在其他的代碼片段調用該函數時傳遞的參數。比如你定義了一個函數 int cgz(int n, int m);
這裏的 n, m 就是形參,它們只是一個“空”,接收實參傳來的數值。或者說,實參的值傳給形參,就是一道……填空題?
實參:也就是"實際參數",是在調用時傳遞給函數的參數,也就是說,傳遞給被調用函數的,是一個數值。比如說,你在主函數中定義了兩個變量 a、b,然後在接下來一行寫下C++標準庫中的max()函數,這時你寫到max(a, b);
,這時的 a, b 就是實參,他們把自己的值傳輸給了max()函數處理,然後返回了一個最大值。
2 全局變量
有些自定義函數,在定義時程序員並沒有寫上形參的語句。就像這樣:
void example( );
^無形參
或:void example(void);
^^^^無形參
這時如果要在函數中對程序進行處理計算,一般是使用全局變量。
Q&A
Q:那麼全局變量是什麼意思呢?
A:全局變量,簡單點說就是不在任何自定義函數(包括主函數)中申明定義,而是在所有函數之外定義的變量。
比如這個程序中,變量a不在任何自定義函數(包括主函數)中申明定義,這就是一個全局變量。
#include<bits/stdc++.h>
using namespace std;
int a; //在所有自定義函數(包括主函數)之外定義。
int by_myself(void){
return a - 1; //別誤會,這只是用到了a,不是在這個函數中定義的。
}
int main(){
a = by_myself(); //調用自定義函數。
return 0;
}
注:程序中有些地方尚未講解,下面會涉及到。
3 非全局變量(或稱局部變量)
非全局變量(或稱局部變量)也稱爲內部變量。局部變量是在函數內作定義申明的。其作用域僅限於定義它的函數內, 離開該函數後再使用這種變量是非法的。
以下看代碼理解:
int example(int a){
int b,c;
…… //若干個操作處理語句
}a,b,c作用域
這段代碼裏的a是形參,可以在這個函數內部調用;b,c是局部變量。
二 傳輸數值或地址
1 傳輸數值
上文講解實參與形參時,是否注意到是實參將自己的值傳輸給了自定義函數中的形參?這就是從調用函數中的實參傳輸了一個數值給被調用函數的形參。(這段可能有點拗口,可以多讀幾遍,一定要搞懂,很重要)
關於實參與形參,上文講得很清楚了,這裏不再贅述。
2 傳輸地址
先舉個例子:
#include <iostream>
using namespace std;
void Add1(int *a) {
(*a) ++;
}
void Add2(int a) {
a ++;
}
int main() {
int x = 1, y = 5;
Add1(&x);
Add2(y);
cout << x << " " << y << endl;
return 0;
}
輸出:
2 5
這兩個自加函數中,Add1是指針傳遞,Add2是數值傳遞.
(以下兩段很重要)
在調用 Add1(&x) 時,系統先建造int型指針a,然後將實參x的地址傳給了指針a,故此時a與&x是指向同一地址,即共享統一數據,當對地址a內的數據進行操作,就是對x進行操作。a++時自然也對x++,當函數調用結束,指針a釋放掉,x的值此時已經發生了變化。
可以說,這種方法就是把兩個數據“捆綁”在了一塊。
在調用Add2(y)時,系統是先建造一個int型變量a,再將y的值傳給a(此時y和a是兩個不同地址的變量,只是兩者值相同),然後a++,卻對y沒有任何操作,故在函數調用結束後,釋放a,而y沒任何變化;
這種方法,主要是爲函數內部接下來的運算服務的,對主函數沒有影響。
3 對比
這就是兩者不同,地址傳遞的參數是指針類型,數值傳遞只是單純地讓被調用的函數“知道”一個值。
至於選擇那種傳遞,就要看這個程序的具體目的和功能了,一般要對參數進行修改的要用地址傳遞,而只是調用參數的數據進行其他計算並不需要修改數據本身宜用數值傳遞。
總代碼
//cpp
#include<bits/stdc++.h>
using namespace std;
int n = 6; //全局變量n,在所有自定義函數(包括主函數)之外定義。
int by_myself(void){ //無形參
return n - 1; //別誤會,這只是用到了n,不是在這個函數中定義的。
}
void Add1(int *a) { //地址傳輸
(*a) ++;
}
void Add2(int a) { // 傳輸數值
a ++;
}
int main(){
int x = 1, y = 5; //定義局部變量 x, y
n = by_myself(); //調用自定義函數。
Add1(&x);
Add2(y);
cout << n << " " << x << " " << y << endl;
return 0;
}
輸出:
5 2 5