创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)
函數(shù)參數(shù)傳遞的兩種方式為值傳遞和引用傳遞
目錄
函數(shù)參數(shù)傳遞的兩種方式為值傳遞和引用傳遞
1.傳值方式傳參
2.引用方式傳參
3.通過一段代碼運(yùn)行進(jìn)一步理解傳指針(包括二級指針)和傳指針的引用
4.總結(jié)
1.傳值方式傳參
c語言是按值傳遞的,在函數(shù)中被傳遞的參數(shù)的本身(實(shí)參)是不能被修改的!參數(shù)x傳進(jìn)去的時候會被復(fù)制了一份copy,此后的修改都是在臨時變量copy上,出了函數(shù)體copy被銷毀,x還是原來的x,根本就沒有被修改過,所以對變量x的修改無效。
如果想要修改傳入的參數(shù),有兩種方法:
①傳地址,傳入x的地址,也就是將指向x的指針作為參數(shù)進(jìn)行傳遞,【指針參數(shù)傳遞本質(zhì)上是值傳遞,它所傳遞的是一個地址值】int f(int *x); f(&x); 指針傳進(jìn)去被復(fù)制了一份copy,x的指針的copy指向的內(nèi)容也是x,對指針的copy的修改也就是修改了x的內(nèi)容。?對于①來講,在函數(shù)中如果傳遞的是指針,那么只能修改指針指向的內(nèi)容,不能修改指針本身;如果想要修改指針本身,要么在再加一級指針,要么用引用&。
②引用傳參?,引用傳參往往要比值傳參高效,因?yàn)樗侵苯訉作為參數(shù)傳入進(jìn)去,而少了對x進(jìn)行復(fù)制這部分的開銷,既然傳入進(jìn)去的是x,那么對x的修改肯定也生效。
2.引用方式傳參
引用可以被理解為變量的一個別名,但這依舊是原變量,如果在函數(shù)內(nèi)對該變量進(jìn)行修改的話,在外部該變量也會相應(yīng)被修改。一定要先有原變量,才能有原變量的別名,故引用一定要賦初值,寫成int &a=一個已存在的值的形式。
int a=11; int &b=a; b=9 在這時輸出a的值發(fā)現(xiàn)a=9。?
【比如:我的名字叫王**,別名叫王哥,我在函數(shù)里傳入的參數(shù)為王哥,在函數(shù)內(nèi)部我修改了王哥的體重,那么在調(diào)用函數(shù)時,王**的體重也被修改了。】
引用聲明后使用方式和原變量一樣(用指針的話要加一個取值的操作)
3.通過一段代碼運(yùn)行進(jìn)一步理解傳指針(包括二級指針)和傳指針的引用
①函數(shù)傳遞的是指針變量的值——即該指針?biāo)赶虻淖兞康牡刂?#xff0c;只能改變指針?biāo)赶蜃兞康闹?#xff0c;而不能改變指針本身的值
錯誤例子 在函數(shù)中如果傳遞的是指針,那么只能修改指針指向的內(nèi)容, 不能修改指針本身;如果想要修改指針本身,要么在再加一級指針,要么用引用&。 #include<cstdio> #include<stdlib.h> typedef struct LNode{int data;struct LNode *next; }LNode,*LinkList; void CreateList(LNode *header){header=(LNode*)malloc(sizeof(LNode));header->data=11;header->next=NULL; } int main(){LinkList head=NULL;CreateList(head);if(head!=NULL){printf("%d\n",head->data);//什么都沒有輸出 }free(head);return 0; } //正確例子 (1) #include<stdio.h> #include<stdlib.h> typedef struct LNode{int data;struct LNode *next; }LNode,*LinkList; LinkList CreateList(){LinkList header;header=(LinkList)malloc(sizeof(struct LNode));header->data=11;header->next=NULL;return header; } int main(){LinkList head = CreateList();if(head!=NULL){printf("%d\n",head->data);//什么都沒有輸出 }free(head);return 0; } //正確例子 #include<stdio.h> #include<stdlib.h> typedef struct LNode* Linklist; typedef struct LNode{int data;Linklist next; }lnode; void creatLNode( Linklist *P){*P = (Linklist)malloc(sizeof(struct LNode));(*P)->data = 11;(*P)->next = NULL; } int main(){Linklist P;creatLNode(&P);if(P){printf("%d ",P->data );} }?
4.總結(jié)
其實(shí)指針類型和基本類型(比如int)來說,并沒有本質(zhì)上的差別。示例 :int x;LNode *L; (LNode為結(jié)構(gòu)體)
在傳值方式傳參時,對于基本類型:函數(shù)參數(shù)為int x,調(diào)用函數(shù)傳入x;對于指針:函數(shù)參數(shù)為LNode *,調(diào)用函數(shù)時傳入L
在地址傳遞時,對于基本類型:函數(shù)參數(shù)為int *x,調(diào)用函數(shù)傳入&x;對于指針:函數(shù)參數(shù)為LNode **,調(diào)用函數(shù)時傳入&L。????
在引用方式傳參,對于基本類型:函數(shù)參數(shù)為int??&x,調(diào)用函數(shù)傳入x;對于指針:函數(shù)參數(shù)為LNode* &L(或LinkList &L ),調(diào)用函數(shù)時傳入&L。???
當(dāng)你傳值時,只可以引用值而不可以改變值,但傳值引用時,可以改變值;?當(dāng)你傳指針時,只可以改變指針?biāo)傅膬?nèi)容,不可以改變指針本身,但傳指針引用時,即可以改變指針?biāo)傅膬?nèi)容,又可以改變指針本身
→補(bǔ)充注意點(diǎn):
①在定義函數(shù)時函數(shù)括號中的變量名成為形式參數(shù),簡稱形參或虛擬參數(shù);在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,該函數(shù)括號中的參數(shù)名稱為實(shí)際參數(shù),簡稱實(shí)參,實(shí)參可以是常量、變量或表達(dá)式。
②C語言中實(shí)參和形參之間的額數(shù)據(jù)傳遞是單向的“值傳遞”,單向傳遞,只能由實(shí)參傳給形參,反之不能。
③被調(diào)用函數(shù)的形參只有函數(shù)被調(diào)用時才會臨時分配存儲單元,一旦調(diào)用結(jié)束占用的內(nèi)存便會被釋放。
④”按值傳遞“中包括值傳遞和指針傳遞(指針傳遞參數(shù)本質(zhì)上是值傳遞的方式,它所傳遞的是一個地址值),傳遞的都是實(shí)參的一個拷貝;雖然指針傳遞可以通過改變地址值來改變指針?biāo)赶虻淖兞康闹?#xff0c;但是不能改變指針本身的值。
⑤對于指針的引用類似于二級指針,但是也有一定的區(qū)別:無論你傳值還是傳指針,函數(shù)都會生成一個臨時變量, 但傳引用時,不會生成臨時變量,不進(jìn)行返回值copy等,速度快。
⑥關(guān)于引用傳遞和指針傳遞(本質(zhì)是值【地址值】傳遞):
·?相同點(diǎn):都是地址的概念
指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;而引用則是某塊內(nèi)存的別名。
·?不同點(diǎn):?
指針是一個實(shí)體(也可以理解為替身);引用只是一個別名(本體的另一個名字)
引用只能在定義時被初始化一次,之后不可改變;指針可以修改;
引用不能為空;指針可以為空;
sizeof 引用,得到的是所指向變量的大小;sizeof 指針,得到的是指針的大小;
指針 ++,意義為 指針的地址自增;引用++則是 所指變量自增;
引用是類型安全的,引用過程會進(jìn)行類型檢查;指針不會進(jìn)行安全檢查;
總結(jié)
以上是生活随笔為你收集整理的创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构 快速排序(详解)
- 下一篇: 气滞血瘀西医叫什么