2.指標與引用區別
3.引數為指標的指標或指標的引用
將實參複製乙份給形參,形參為函式的區域性變數,因此函式對形參操作對實參沒有影響。若傳遞物件會產生物件副本,會呼叫拷貝建構函式,操作完後要呼叫析構函式。
形參為指向實參位址的指標,其也算一種按值傳遞,只不過是將實參的位址作為引數傳遞給形參,因此函式對形參的指向操作時會改變實參。若傳遞物件會產生物件副本,會呼叫拷貝建構函式,操作完後要呼叫析構函式。
形參相當於實參的別名,因此函式相當於直接對實參進行操作。若傳遞物件不產生物件副本,效率更高。
下面看看三種引數傳遞的具體**:
#include
;using namespace std;
void
swap1
(int a,
int b)
;//按值傳遞
void
swap2
(int
*a,int
*b);
//指標傳遞
void
swap3
(int
&a,int
&b);
//引用傳遞
intmain()
//按值傳遞
void
swap1
(int a,
int b)
//指標傳遞
void
swap2
(int
*a,int
*b)//引用傳遞
void
swap3
(int
&a,int
&b)
執行結果:
指標引用
定義:int *p;
定義:int &b=a;
初始化:p=&a; 或int *p=&a;
必須定義同時初始化
可修改指向,指向可為空
初始化後不可改變,指向必須有效
指標是個實體,有多級指標
引用是個別名,沒有位址,沒有多級引用
不進行安全檢查
引用過程會進行安全檢查
sizeof(指標)得到指標大小
sizeof(引用)得到變數的大小
自增自減操作是對位址的操作
自增自減操作是對所指變數操作
若引數為指標,並且需要對指標本身進行修改,那麼就需要將函式引數型別設為指標的指標或者指標的引用,如下面例子:
#include
;#include
;using namespace std;
void
func
(char
*a);
//指標
void
func1
(char
**a)
;//指標的指標
void
func2
(char
*&a)
;//指標引用
intmain()
//指標
void
func
(char
*a)if
(*a ==
'\0'
)return
;else
func
(a);
func
(a);
}//指標的指標
void
func1
(char
**a)if(
**a ==
'\0'
)return
;else
func1
(a);
func1
(a);
}//指標引用
void
func2
(char
*&a)if(
*a ==
'\0'
)return
;else
func2
(a);
func2
(a);
}
執行結果為:
我們分析一下這段程式。這段程式的作用是列印出字串中的每個字元,若遇到#號則跳過。b、c、d為指向字串首位的位址,分別將這三個指標作為引數傳遞給三個遞迴函式func()、func1()、func2()。接下來我們逐個分析各個函式:
直接把指標b作為引數傳遞給func()函式,由於每次遇到return都會釋放指標a,因此指標的指向並不會改變。執行過程如下,輸出為:a b b。
func1()函式把指標的指標作為引數,*a代表指標,a代表指標的指標,每當遇到return時指標的指標a都會被釋放,但指標的指向已經改變,因此在遇到字元』#'後指標已經指向後面的字元,可以繼續輸出後面的字元。執行過程如下,輸出為:a b c d e。
func2()函式把指標的引用作為引數,因此指標會一直自增,不會隨著return而釋放,直至指標指向』\0』,程式停止。
若實參為指標,並且想要對指標本身進行修改,那麼就需要使用指標的指標或者指標引用作為函式引數。
c 引數傳遞
引數型別分為int,ref,out三種,預設為int.int型別在字方法中修改了對應變數後,主方法中的值不會發生變化.ref型別在方法中修改了對應變化後,主方法中的值也會發生變化.out主方法中對應的變數不需要初始化.例子 using system using system.collections....
c 引數傳遞
引數傳遞 形參 parameter 和實參 argument int num int a,int b int num int a,int b 在函式的宣告或者定義裡,由由0個或多個形參組成的列表。intmain 形參的型別決定了形參實參互動的方式,如形參是引用型別,他將繫結到對應的實參上,引用形參是...
C 引數傳遞
值型別值傳遞 public void add1 int a 值型別引用傳遞 public void add2 ref int a public void add3 out int a 呼叫 b 5 add1 b b 5,輸出10 add2 ref b b 10,輸出10 add3 out b b 1...