第10章 指針(七) 應(yīng)用1------函數(shù)間數(shù)據(jù)的雙向傳遞
|
聲明:文中觀點(diǎn)僅代表個(gè)人,其中文字、圖片未經(jīng)本人許可,不得部分或全部轉(zhuǎn)載,違者所造成影響后后果自負(fù)!聯(lián)系本人方式:80368704@qq.com QQ:80368704
忠告:函數(shù)概念過關(guān)的往下看,否則回到函數(shù)的相關(guān)章節(jié)去?。。。?! 忠告:指針概念過關(guān)的往下看,否則回到指針的前面六節(jié)去?。。。。?/span> 警告:上述2個(gè)內(nèi)容沒有過關(guān)的,往下看,無異于對(duì)你學(xué)習(xí)指針信心的自殺!因?yàn)樵谙旅?,我將不再把你?dāng)作最初級(jí)的程序?qū)W習(xí)者,不再做最初級(jí)的解釋了,我假設(shè),你已經(jīng)是進(jìn)階者! 函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù),還可以是變量的指針,它將一個(gè)變量的首地址從主調(diào)函數(shù)傳送到另一個(gè)函數(shù)中,以間接的方式,實(shí)現(xiàn)了函數(shù)間數(shù)據(jù)的雙向傳遞。譚浩強(qiáng)先生用一個(gè)簡(jiǎn)單的例子:輸入兩個(gè)整數(shù),按大小順序輸出,用函數(shù)處理,說明了指針的這類應(yīng)用。 1、【例】輸入的兩個(gè)整數(shù)按大小順序輸出, 用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。 swap(int *p1,int *p2) temp=*p1; main() { int a,b; scanf("%d,%d",&a,&b);
接著執(zhí)行if語(yǔ)句,由于a〈b,因此執(zhí)行swap函數(shù)。注意實(shí)參pointer_1和pointer_2是指針變量,在函數(shù)調(diào)用時(shí),將實(shí)參變量的值傳遞給形參變量。采取的依然是“值傳遞”方式。因此虛實(shí)結(jié)合后形參p1的值為&a,p2的值為&b。這時(shí)p1和pointer_1指向變量a,p2和pointer_2指向變量b。
接著執(zhí)行執(zhí)行swap函數(shù)的函數(shù)體使*p1和*p2的值互換,也就是使a和b的值互換。
函數(shù)調(diào)用結(jié)束后,p1和p2不復(fù)存在(已釋放)如圖。
最后在main函數(shù)中輸出的a和b的值是已經(jīng)過交換的值。 進(jìn)一步分析如下:表面上看,由于a和b是main()的局部變量,他們的作用域就是main()的函數(shù)體,因此a,b對(duì)于swap()是不可見的,即swap()不能對(duì)a和b賦值,也不能使用a和b中的數(shù)據(jù)進(jìn)行運(yùn)算; 但是,當(dāng)我們通過使用指針參數(shù)pointer1和pointer2,將&a、&b這2個(gè)地址從main()傳入了swap();那么,swap()通過該地址,就可以找到main()的a,b,從而使得swap()就象main()一樣,可以直接對(duì)a、b賦值,或直接用a、b中的值進(jìn)行運(yùn)算。 這樣一來,主調(diào)函數(shù)main()可以存取a、b,而被調(diào)函數(shù)swap()通過傳入的地址,也可以存取a、b。我們說a、b在main()和swap()間被共享了。 既然變量都被共享了,那么main()就可以通過a、b給swap()傳送數(shù)據(jù);同理swap()也可以通過a、b給main()傳送數(shù)據(jù)了,這就是說,我們實(shí)現(xiàn)了這2個(gè)函數(shù)間的雙向數(shù)據(jù)傳遞。 恰可謂明修棧道,暗渡陳倉(cāng)?。?!
swap(int *p1,int *p2) 上面的錯(cuò)誤在于int *temp是一個(gè)野指針?。?!當(dāng)你定義了一個(gè)指針A,但是沒有明確指定A指向哪個(gè)變量,那么A就叫野指針; 一定要給你的指針變量賦初值,不要讓他成為野指針,否則他會(huì)桀驁不馴,成為一個(gè)很危險(xiǎn)的東西。 遙想當(dāng)年,他搞死過我的程序,也使我的系統(tǒng)死過機(jī),甚至摧毀了我的操作系統(tǒng).......;你要格外小心,不要讓世界末日降臨。 3、請(qǐng)考慮下面的函數(shù)能否實(shí)現(xiàn)實(shí)現(xiàn)a和b互換。 swap(int x,int y) {int temp; temp=x; x=y; y=temp; } 如果在main函數(shù)中用“swap(a,b);”調(diào)用swap函數(shù),會(huì)有什么結(jié)果呢?請(qǐng)看下圖所示。
上面的分析,再次驗(yàn)證了函數(shù)參數(shù)的單向值傳遞原則?。。?/strong> 4、【例】請(qǐng)注意,不能企圖通過改變指針形參的值而使指針實(shí)參的值改變。 swap(int *p1,int *p2) {int *p; p=p1; p1=p2; p2=p; } main() { int a,b; int *pointer_1,*pointer_2; scanf("%d,%d",&a,&b); pointer_1=&a;pointer_2=&b; if(a<b) swap(pointer_1,pointer_2); printf("/n%d,%d/n",*pointer_1,*pointer_2); }
其中的問題在于不能實(shí)現(xiàn)如圖所示的第四步(d)。
函數(shù)使用指針作為參數(shù)時(shí),作為函數(shù)參數(shù)的一種,指針參數(shù)仍然也必須遵守單向值傳遞的原則,即指針參數(shù)中地址在被調(diào)函數(shù)中的改變,不會(huì)返回到主調(diào)函數(shù) ![]() ![]() ![]() ![]() ![]() ![]() |
作者:
RDIF
出處:
http://www.rzrgm.cn/huyong/
Email:
406590790@qq.com
QQ:
406590790
微信:
13005007127(同手機(jī)號(hào))
框架官網(wǎng):
http://www.guosisoft.com/
http://www.rdiframework.net/
框架其他博客:
http://blog.csdn.net/chinahuyong
http://www.rzrgm.cn/huyong
國(guó)思RDIF開發(fā)框架
,
給用戶和開發(fā)者最佳的.Net框架平臺(tái)方案,為企業(yè)快速構(gòu)建跨平臺(tái)、企業(yè)級(jí)的應(yīng)用提供強(qiáng)大支持。
關(guān)于作者:系統(tǒng)架構(gòu)師、信息系統(tǒng)項(xiàng)目管理師、DBA。專注于微軟平臺(tái)項(xiàng)目架構(gòu)、管理和企業(yè)解決方案,多年項(xiàng)目開發(fā)與管理經(jīng)驗(yàn),曾多次組織并開發(fā)多個(gè)大型項(xiàng)目,在面向?qū)ο蟆⒚嫦蚍?wù)以及數(shù)據(jù)庫(kù)領(lǐng)域有一定的造詣?,F(xiàn)主要從事基于
RDIF
框架的技術(shù)開發(fā)、咨詢工作,主要服務(wù)于金融、醫(yī)療衛(wèi)生、鐵路、電信、物流、物聯(lián)網(wǎng)、制造、零售等行業(yè)。
如有問題或建議,請(qǐng)多多賜教!
本文版權(quán)歸作者和CNBLOGS博客共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,如有問題,可以通過微信、郵箱、QQ等聯(lián)系我,非常感謝。







浙公網(wǎng)安備 33010602011771號(hào)