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;
}
運行結果
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500648.html
標籤:其他
上一篇:JAVA基礎學習第三天!
下一篇:軟考總結
