亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中傳值與傳指針的介紹與區別

2020-01-26 13:26:25
字體:
來源:轉載
供稿:網友

前言

我們可能聽過C語言中的傳值和傳指針,在其他語言中,也有傳引用一說,那么他們到底有什么區別呢?如果你還不能準確地分辨,就該好好了解一下了。

傳值

我們在初學C語言的時候就被老師教過,下面的方式是無法交換a和b的值的:

#include<stdio.h>void swap(int a,int b){ int temp = a; a = b; b = temp; printf("swap a = %d,b = %d/n",a,b);}int main(void){ int a = 10; int b = 20; printf("before swap:a = %d,b = %d/n",a,b); swap(a,b); printf("after swap:a = %d,b = %d/n",a,b); return 0;}

運行結果如下:

before swap:a = 10,b = 20                                                                                                                                                                  
internal swap a = 20,b = 10                                                                                                                                                                
after  swap:a = 10,b = 20

可以看到,a和b的值最終并沒有被交換。開始時a,b的值為10,20,而最終還是同樣的值。

為什么呢?因為函數參數在傳遞的時候,都是傳原數據的副本,也就是說,swap內部使用的a和b只是最初始a和b的一個副本而已,所以無論在swap函數內部對a和b做任何改變,都不會影響初始的a和b的值。

正因如此,我們常常被告知,不要把直接把結構體直接作為參數,這樣效率會很低。由于結構體本身占用字節數較大,如果直接作為參數,那么將會產生一個較大的”副本“,如此一來,效率也就很低了。

我們再結合下面的圖來理解:

首先圖中方框中的上部分a和b代表了main函數中的a和b,即原始數據,而方框中的下部分a和b代表了函數的參數a和b,即原始數據的“副本”。(后面的圖都是如此,上部分代表原始值,下部分代表函數參數值)。

調用swap函數前后的情形如下:

由于在swap中永遠只是對a和b的副本進行操作,因此完全不影響原始的a和b的值。最終也不可能達到交換a和b的值的目的。

傳指針

那么為解決上面的問題,我們知道,需要傳指針。其代碼如下:

#include<stdio.h>void swap(int *a,int *b){ int temp = *a; *a = *b; *b = temp; printf("swap a = %d,b = %d/n",*a,*b);}int main(void){ int a = 10; int b = 20; printf("before swap:a = %d,b = %d/n",a,b); swap(&a,&b); printf("after swap:a = %d,b = %d/n",a,b); return 0;}

運行結果:

before swap:a = 10,b = 20                                                                                                                                                                  
swap a = 20,b = 10                                                                                                                                                                         
after  swap:a = 20,b = 10

可以看到在這種情況下,a,b的值才是真正交換了。

為什么又有傳值,又有傳指針

看到這里,不知道你是否會疑惑,為什么給函數傳遞參數的時候,一會是傳值,一會是傳指針呢?為什么傳指針就能改變參數的值呢?實際上,C語言里,參數傳遞都是值傳遞!也就是說,你認為的傳指針也是傳值,只不過它的值是指針類型罷了。

我們再通過圖來理解前面為什么傳指針就可以交換a,b的值:

從圖中可以看出,雖然傳遞給函數的是指向a和b的指針的副本,但是它的副本同樣也是指向a和b,因此雖然不能改變指針的指向,但是能改變參數a和b指向的內容,即改變原始a和b的值。

再看傳指針

如果是為指針p申請一段內存,下面的代碼能達到目的嗎?

#include<stdio.h>#include<stdlib.h>void getMemery(int *p){ /*申請1024個int大小*/ p = malloc(sizeof(int)*1024); if(NULL == p) { printf("malloc failed/n"); p = NULL; }}int main(void){ int *p = NULL; getMemery(p); printf("address of p is %p/n",p); return 0;}

通過前面的內容分析,肯定是達不到預期效果的。

 運行結果:

address of p is (nil)

這是為什么呢?我們還是利用前面所知來分析,由于傳遞給getMemory函數的參數都是一個副本,因此函數內的p也是外部p的一個副本,因此即便在函數內部,將p指向了一塊新申請的內存,仍然不會改變外面p的值,即p還是指向NULL。

如何修改呢?我們需要傳入p的地址,即指向int類型指針的指針。

#include<stdio.h>#include<stdlib.h>void getMemery(int **p){ /*申請1024個int大小*/ *p = malloc(sizeof(int)*1024); if(NULL == *p) { printf("malloc failed/n"); *p = NULL; }}int main(void){ int *p = NULL; getMemery(&p); printf("address of p is %p/n",p); free(p); p = NULL; return 0;}

運行結果如下:

address of p is 0x144f010

從運行結果可以看到,p的值被改變了。

可配合下面的圖進行理解:

總結

本文總結如下:

  • 函數的形參都是原數據的“副本”,因此在函數內無法改變原數據
  • 函數中參數都是傳值,傳指針本質上也是傳值
  • 如果想要改變入參內容,則需要傳該入參的地址(指針和引用都是類似的作用),通過解引用修改其指向的內容
  • 以上結論不限于C語言

思考

  • 如何實現不借助第三個變量,交換兩個整數的值?
  • 結合本文,理解C++/Java中所謂的傳引用

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

本文作者: 守望

本文鏈接: https://www.yanbinghu.com/2019/06/20/53981.html

版權聲明: 本文為原創文章,版權歸守望所有,并采用 CC BY-NC-SA 3.0 許可協議。轉載請聯系本人!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影第一页| 亚洲精品suv精品一区二区| 亚州欧美日韩中文视频| 91欧美视频网站| 自拍视频国产精品| 日韩中文字幕在线| 国产一区二区丝袜高跟鞋图片| 中文字幕日韩欧美在线视频| 亚洲精品久久久久中文字幕二区| 成人激情免费在线| 91久热免费在线视频| 亚洲国产精品悠悠久久琪琪| 国产精品视频地址| 国产精品久久久久久久7电影| 亚洲xxx大片| 黑人与娇小精品av专区| 久久久999国产精品| www.日韩不卡电影av| 欧美日韩亚洲一区二区三区| 欧美高清视频在线观看| 色系列之999| 国产日韩欧美在线视频观看| 亚洲女人初尝黑人巨大| 亚洲精品电影在线| 亚洲免费精彩视频| 亚洲视频视频在线| 国产91精品久久久久久久| 91精品久久久久久久久久入口| 最近2019中文字幕在线高清| 欧美大尺度激情区在线播放| 视频在线观看99| 国产成人精品免费视频| 日韩免费av一区二区| 98精品国产自产在线观看| 国产午夜精品麻豆| 91av在线播放| 国产成人涩涩涩视频在线观看| 亚洲午夜女主播在线直播| 欧美午夜宅男影院在线观看| 懂色av一区二区三区| 国产精品国产三级国产aⅴ浪潮| 超碰97人人做人人爱少妇| 欧美一区二区三区图| 久久久久久久久久亚洲| 亚洲热线99精品视频| 国产91色在线| 亚洲人免费视频| 日韩免费在线免费观看| 国产一区二区三区免费视频| 欧美高清视频在线观看| 亚洲女成人图区| 中文字幕亚洲无线码a| 国产精品7m视频| 欧美性jizz18性欧美| 九九热精品在线| 欧美精品日韩三级| 亚洲精品99999| 欧美成人精品影院| 欧美插天视频在线播放| 亚洲欧洲高清在线| 亚洲999一在线观看www| 国产精品第一视频| 日韩精品极品毛片系列视频| 成人免费淫片视频软件| 成人精品网站在线观看| 亚洲va欧美va国产综合久久| 欧美成人免费va影院高清| 欧美高跟鞋交xxxxhd| 精品露脸国产偷人在视频| 日本人成精品视频在线| 欧美一区亚洲一区| 夜夜嗨av一区二区三区四区| 这里只有视频精品| 国产精品视频永久免费播放| 麻豆精品精华液| 国产精品亚洲第一区| 国产精品美女久久久久av超清| 91精品国产高清久久久久久久久| 日韩毛片在线看| 欧美中文字幕在线观看| 国产亚洲一区二区在线| 欧美成人午夜激情在线| 91免费的视频在线播放| 亚洲a一级视频| 成人精品视频在线| 成人自拍性视频| 欧美肥老太性生活视频| 久久久av网站| 欧洲s码亚洲m码精品一区| 国产精品欧美日韩一区二区| 亚洲欧美日韩高清| 日本sm极度另类视频| 国产日韩欧美91| 一色桃子一区二区| 欧美日韩在线另类| 国产成人福利网站| 亚洲欧美三级在线| 岛国av一区二区在线在线观看| 国产精品极品美女粉嫩高清在线| 欧美激情奇米色| 亚洲aa中文字幕| 亚洲伊人成综合成人网| 国产一区二区三区在线免费观看| 国产精品爱久久久久久久| 欧美成人精品h版在线观看| 日韩精品中文字幕视频在线| 亚洲美女精品成人在线视频| 成人写真视频福利网| 国语自产精品视频在线看| 国产剧情日韩欧美| 国产精品美女久久久免费| 国产精品久久久久高潮| 91豆花精品一区| 中文字幕不卡av| 欧美激情在线有限公司| 韩国精品美女www爽爽爽视频| 欧洲精品在线视频| 中文字幕在线精品| 91久久久精品| 亚洲一区二区国产| 色www亚洲国产张柏芝| 亚洲免费视频网站| 国产999精品久久久影片官网| 最近2019中文字幕在线高清| 精品久久久av| 欧美肥婆姓交大片| 91视频88av| 日韩在线欧美在线国产在线| 欧美成人免费va影院高清| 一区二区福利视频| 欧美一性一乱一交一视频| 尤物99国产成人精品视频| 欧美日本高清一区| 日本精品久久久| 日韩在线观看你懂的| 久久精品国产一区二区三区| 亚洲天堂免费观看| 正在播放国产一区| 欧美视频不卡中文| 亚洲国产精品一区二区久| 福利视频导航一区| 国产大片精品免费永久看nba| 国产精品成人一区二区三区吃奶| www.欧美视频| 精品自拍视频在线观看| 国产盗摄xxxx视频xxx69| 性欧美xxxx视频在线观看| 欧美国产日韩中文字幕在线| 麻豆精品精华液| 欧美老女人xx| 欧美成人精品在线观看| 2019中文字幕免费视频| 久久久久国产一区二区三区| 欧美日韩免费观看中文| 欧美日本国产在线| 国产亚洲精品成人av久久ww| 精品国产欧美一区二区三区成人| 亚洲成人激情小说| 国产精品美女在线观看| 亚洲国产91色在线| 91国产美女视频| 日韩久久精品电影| 亚洲女性裸体视频| 国产91成人video|