1、引例 【例1】 分析該程式,有哪些問題 int main() { swap(int p, int q); int a = 10, b = 20; printf("(1)a = %d, b = %d\n", a, b); swap(&a, &b); printf("(2)a = %d, b = % ...
1、引例
【例1】 分析該程式,有哪些問題
int main()
{
swap(int p, int q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("(2)a = %d, b = %d\n", a, b);
}
swap(int p, int q)
{
int t;
t = p;
p = q;
q = t;
}
分析,該程式的功能是將a和b的值通過函數swap()進行交換,最後輸出結果,但編譯時會發生語法錯誤。
修改意見:
1、定義、聲明用戶自定義函數時,因該對函數添加返回值(即將第9行和第3行修改為void swap(int p, 、int q)
)。
2、由於定義函數swap()時,參數p和q 都為整型,因此當調用該函數時,實際參數也應為整型(即,將第6行改為 swap(a, b)
)
修改後,該程式為
int main()
{
void swap(int p, int q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(a, b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int p, int q)
{
int t;
t = p;
p = q;
q = t;
}
程式的運行結果為:
可見,雖然程式可以運行,但並沒有實現對a和b 的值交換。
2、值傳遞
2.1 定義
定義 1 (值傳遞)在調用函數的過程中,只將實參的值賦值(複製)給形參,被調用函數的內部對形參的修改,不會引起實參的變化。
【例2】值傳遞
int main()
{
void swap(int p, int q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(a, b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int p, int q)
{
int t;
t = p;
p = q;
q = t;
}
這種方式叫做值傳遞。在main函數執行過程中,當執行到調用函數swap(a,b)時,此時main函數跳轉到swap函數繼續執行,同時將實參a和b的值賦值(複製)給形參p和q,在swap函數內部藉助變數t,實現形參p和q值的交換(然而形參p和q值的交換,對實參a和b的值並無影響,該語句只是將實參a和b的值賦值給形參p和q,僅此而已)。當調用函數執行完之後,返回到調用函數swap(a,b)的下一條語句繼續執行。
3、地址傳遞
3.1 定義
定義 2(指針傳遞)在調用函數的過程中,將實參的地址傳遞給形參,被調用函數的內部對形參的修改,會同步引起實參的修改。
【例3】地址傳遞
int main()
{
void swap(int *p, int *q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int *p, int *q)
{
int t;
t = *p;
*p = *q;
*q = t;
}
這種方式叫做指針傳遞。在執行調用函數的過程中,調用函數swap(&a,&b)將實參a、b的地址賦值給形參p、q,由於p、q為指針,那麼p、q所指向的值與a、b的值必然相同(即p、q分別指向a、b)。在調用函數內部,對p、q所指向的值修改,即是對實參a、b值的修改。
4、引用
4.1 定義
定義 3(引用)對某一變數的重命名(別名),對引用的操作等同於對變數的操作。
4.2 聲明
類型標識符 &引用名=目標變數名
【例4】
int b;
int &a=b; // 定義了引用a,即a是變數b 的別名
註:
(1)& 為標識符,不是取地址運算
(2)聲明引用的同時,必須同時初始化
(3)當對目標變數聲明引用之後,等同於目標變數有一個別名,即 a=1等價於b=1
(4)引用不占存儲單元,對引用求地址,等同於對目標變數求地址,即 &a=&b
(5)對數組不能建立引用
4.3 用途
(1)函數參數傳遞,
用引用傳遞參數,由於引用不占用記憶體空間,對引用的修改即是對目標函數的修改,從而提高效率
4.4 與指針的區別
指針是通過指針變數對所指向的值間接操作,使用指針,程式的可理解性變差。而引用時目標變數的別名,對引用的操作就是對目標變數的操作。
【例5】引用傳遞參數
int main()
{
void swap(int &p, int &q);
int a = 10, b = 20;
printf("(1)a = %d, b = %d\n", a, b);
swap(a, b);
printf("(2)a = %d, b = %d\n", a, b);
}
void swap( int &p, int &q)
{
int t;
t = p;
p = q;
q = t;
}
運行結果