c語言中函式傳參方式:傳值和傳址
傳值:在函式呼叫過程中會生成乙份臨時變數用形參代替,最終把實參的值傳遞給新分配的臨時變數即
形參。
優點:避免了函式呼叫的***,但無法改變形參的值(若要改變形參的值,只能通過指標傳
遞) 缺點:不是很形象友好,不安全
int a = 1
; int *p = &a;
int a = 1
; int &b = a;
上面定義了乙個整型變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址
2定義了乙個整型變數a和這個整型a的引用b,事實上a和b是同一樣東西,在記憶體占有同乙個儲存單元
***引用*(某塊記憶體的別名)
1.概念
引用不是新定義乙個變數,而是給已存在的變數取乙個別名,編譯器不會為引用變數開闢記憶體空間,它和它引用的變數共有同一塊記憶體空間
型別& 變數(物件) = 引用變數名;
**注:型別必須和引用變數是同種型別
*****
*****
*****
*****
*****引用型別的初始值必須是乙個物件*****
*****
*****
***int &a = 10; //錯誤
double a = 10;
int &b = a; //錯誤:此處引用物件的初始值必須為int型物件
2.引用特性
(1)引用在定義時必須初始化,而且不能改變
(2)乙個變數可以有多個引用
(3)引用一旦繫結乙個實體,就不能再改變為其他變數的引用
3.使用場景
(1)函式形參
(2)返回值
2.1 值返回
2.3 引用返回
注: 不要返回棧記憶體的引用
不同點:(1)引用定義時必須初始化,指標可以不用,正常情況下需初始化為null;
(2)引用一旦定義就不能再改變,但指標可以
(3)可以有多級指標,但不能有多級引用
(4)一旦乙個引用被初始化為指向乙個物件,就不能再指向其他物件,而指標可以在任何時候
指向任何乙個同型別物件
(5)沒有null引用,但有null指標
(6)在sizeof中含義不同:引用結果為引用型別的大小,但指標始終是位址空間所佔位元組個數
(7)引用自加改變變數的內容,指標自加改變指標指向
(8)引用比指標使用起來相對更安全(引用比指標多了型別檢測)
(9)可以有const指標(const指標不可變),但沒有const引用
(10)指標是乙個實體,而引用僅是個別名
注意:引用作為函式引數時,會引發一定的問題,因為讓引用作引數,目的就是想改變這個引用所指向位址的內容,而函式呼叫時傳入的是實參,看不出函式的引數是正常變數,還是引用,因此可能發生引發錯誤。所以使用時一定要小心謹慎。
//指標
指標與引用類似,指標也實現了對其他物件的間接訪問。 (指標存放某個物件的位址)
(1)指標本身就乙個物件,允許對指標賦值和拷貝,且在指標的生命週期裡它可以先後指向幾個不同的物件
(2)指標無需在定義時賦初值,和其他內建型別一樣,在塊作用域內定義的指標如果沒有被初始化,也將擁有乙個不確定的值
【定義指標】
int
*a, *b; //a和b都是指向int型的指標
double c, *d; //c是double型物件,d是指向double型的物件的指標
【取位址】
int a = 10;
int *p = &a; //p存放變數a的位址,或者p是指向變數a的指標
【指標值】
指標的值(即位址)應屬下列4中狀態之一
(1)指向乙個物件
(2)指向緊鄰物件所佔空間的下乙個位置
(3)空指標,意味著指標沒有任何指向
(4)無效指標,上述情況之外的其他值
【指標訪問物件】
使用解引用符(操作符*)來訪問物件
對解引用的結果賦值,實際上也就是對給指標所指向的物件賦值
*p = 0; //由符號*得到指標p所指向的物件,即可經由p為變數a賦值
cout
<< *p; //輸出0
指標引用和引用指標的區別
c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...
傳指標和傳指標引用的區別 指標和引用的區別(本質)
指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...
傳指標和傳指標引用的區別 指標和引用的區別(本質)
指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...