日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)

發布時間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

函數參數傳遞的兩種方式為值傳遞和引用傳遞

目錄

函數參數傳遞的兩種方式為值傳遞和引用傳遞

1.傳值方式傳參

2.引用方式傳參

3.通過一段代碼運行進一步理解傳指針(包括二級指針)和傳指針的引用

4.總結


1.傳值方式傳參

c語言是按值傳遞的,在函數中被傳遞的參數的本身(實參)是不能被修改的!參數x傳進去的時候會被復制了一份copy,此后的修改都是在臨時變量copy上,出了函數體copy被銷毀,x還是原來的x,根本就沒有被修改過,所以對變量x的修改無效。

如果想要修改傳入的參數,有兩種方法:

①傳地址,傳入x的地址,也就是將指向x的指針作為參數進行傳遞,【指針參數傳遞本質上是值傳遞,它所傳遞的是一個地址值】int f(int *x); f(&x); 指針傳進去被復制了一份copy,x的指針的copy指向的內容也是x,對指針的copy的修改也就是修改了x的內容。?對于①來講,在函數中如果傳遞的是指針,那么只能修改指針指向的內容,不能修改指針本身;如果想要修改指針本身,要么在再加一級指針,要么用引用&。

②引用傳參?,引用傳參往往要比值傳參高效,因為它是直接將x作為參數傳入進去,而少了對x進行復制這部分的開銷,既然傳入進去的是x,那么對x的修改肯定也生效。

2.引用方式傳參

引用可以被理解為變量的一個別名,但這依舊是原變量,如果在函數內對該變量進行修改的話,在外部該變量也會相應被修改。一定要先有原變量,才能有原變量的別名,故引用一定要賦初值,寫成int &a=一個已存在的值的形式。

int a=11; int &b=a; b=9 在這時輸出a的值發現a=9。?

【比如:我的名字叫王**,別名叫王哥,我在函數里傳入的參數為王哥,在函數內部我修改了王哥的體重,那么在調用函數時,王**的體重也被修改了。】

引用聲明后使用方式和原變量一樣(用指針的話要加一個取值的操作)

3.通過一段代碼運行進一步理解傳指針(包括二級指針)和傳指針的引用

①函數傳遞的是指針變量的值——即該指針所指向的變量的地址,只能改變指針所指向變量的值,而不能改變指針本身的值

錯誤例子 在函數中如果傳遞的是指針,那么只能修改指針指向的內容, 不能修改指針本身;如果想要修改指針本身,要么在再加一級指針,要么用引用&。 #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.總結

其實指針類型和基本類型(比如int)來說,并沒有本質上的差別。示例 :int x;LNode *L; (LNode為結構體)

在傳值方式傳參時,對于基本類型:函數參數為int x,調用函數傳入x;對于指針:函數參數為LNode *,調用函數時傳入L
在地址傳遞時,對于基本類型:函數參數為int *x,調用函數傳入&x;對于指針:函數參數為LNode **,調用函數時傳入&L。????
在引用方式傳參,對于基本類型:函數參數為int??&x,調用函數傳入x;對于指針:函數參數為LNode* &L(或LinkList &L ),調用函數時傳入&L。???
當你傳值時,只可以引用值而不可以改變值,但傳值引用時,可以改變值;?當你傳指針時,只可以改變指針所指的內容,不可以改變指針本身,但傳指針引用時,即可以改變指針所指的內容,又可以改變指針本身

→補充注意點:

①在定義函數時函數括號中的變量名成為形式參數,簡稱形參或虛擬參數;在主調函數中調用一個函數時,該函數括號中的參數名稱為實際參數,簡稱實參,實參可以是常量、變量或表達式。

②C語言中實參和形參之間的額數據傳遞是單向的“值傳遞”,單向傳遞,只能由實參傳給形參,反之不能。

③被調用函數的形參只有函數被調用時才會臨時分配存儲單元,一旦調用結束占用的內存便會被釋放。

④”按值傳遞“中包括值傳遞和指針傳遞(指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值),傳遞的都是實參的一個拷貝;雖然指針傳遞可以通過改變地址值來改變指針所指向的變量的值,但是不能改變指針本身的值。

⑤對于指針的引用類似于二級指針,但是也有一定的區別:無論你傳值還是傳指針,函數都會生成一個臨時變量, 但傳引用時,不會生成臨時變量,不進行返回值copy等,速度快。

⑥關于引用傳遞和指針傳遞(本質是值【地址值】傳遞):

·?相同點:都是地址的概念

指針指向一塊內存,它的內容是所指內存的地址;而引用則是某塊內存的別名。

·?不同點:?

指針是一個實體(也可以理解為替身);引用只是一個別名(本體的另一個名字)
引用只能在定義時被初始化一次,之后不可改變;指針可以修改;
引用不能為空;指針可以為空;
sizeof 引用,得到的是所指向變量的大小;sizeof 指針,得到的是指針的大小;
指針 ++,意義為 指針的地址自增;引用++則是 所指變量自增;
引用是類型安全的,引用過程會進行類型檢查;指針不會進行安全檢查;

總結

以上是生活随笔為你收集整理的创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。