C語言用fun函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換方式
用fun函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換
#include <stdio.h> void fun(int *x,int *y)//定義fun函數(shù),此時(shí)需要注意與main函數(shù)時(shí)的定義方式相同 { ?? ?int t;//定義一個(gè)中間變量,用于讓兩個(gè)數(shù)交換留一個(gè)位置 ?? ?t=*x,*x=*y,*y=t; } void main() { ?? ?int a,b; ?? ?scanf("%d %d",&a,&b);//定義兩個(gè)交換的數(shù) ?? ?fun(&a,&b); ?? ?printf("%d ?%d\n",a,b); }
函數(shù)交換兩個(gè)數(shù),常見錯(cuò)誤
問題:提供倆個(gè)數(shù),利用函數(shù)實(shí)現(xiàn)交換。
出現(xiàn)的錯(cuò)誤情況如下:
- 第一種情況:值傳遞;(如函數(shù)Swap_err01)
- 第二種情況:沒解引用;(如函數(shù)Swap_err02)
- 第三種情況:懸掛指針。(如函數(shù)Swap_err03)
能實(shí)現(xiàn)交換兩個(gè)數(shù)的函數(shù),在函數(shù)Swap可以實(shí)現(xiàn)。
代碼如下:
#include <stdio.h> void Swap_err01(int a,int b) { int tmp; tmp = a; a = b; b = tmp; } void Swap_err02(int *p1,int *p2) { int *tmp = p1; p1 = p2; p2 = tmp; } void Swap_err03(int *p1,int *p2) { int *tmp; *tmp = *p1; *p1 = *p2; *p2 = *tmp; } void Swap(int *p1,int *p2) { int tmp; tmp = *p1; *p1 = *p2; *p2 = tmp; } int main () { int a=10; int b=20; printf("a=%d,b=%d\n",a,b); //Swap_err01(a,b); //Swap_err02(&a,&b); //Swap_err03(&a,&b); Swap(&a,&b); printf("a=%d,b=%d\n",a,b); return 0; }
編譯結(jié)果如下:
函數(shù)Swap_err01的編譯結(jié)果:
由結(jié)果可見,按值傳遞,不能達(dá)到交換兩個(gè)數(shù)。
按值傳遞: 函數(shù)內(nèi)部使用的參數(shù)稱為形參,是通過拷貝實(shí)參而來,從而對(duì)其進(jìn)行修改,所以,對(duì)原來的實(shí)參不會(huì)造成修改。
如下圖所示,內(nèi)部變量互不影響。
函數(shù)Swap_err02的編譯結(jié)果:
由結(jié)果可見,換位失敗,其主要原因就是因?yàn)闆]有解引用,過程可看下圖。
函數(shù)Swap_err03的編譯結(jié)果:
由編譯結(jié)果可見,實(shí)行函數(shù)的時(shí)候,編譯器(Visual Studio 2012)報(bào)錯(cuò)了,內(nèi)容是變量tmp沒有被定義,其主要原因是,*tmp為懸掛指針(野指針),野指針:沒有訪問權(quán)限的指針(地址)。
函數(shù)Swap的編譯結(jié)果:
由結(jié)果可見,實(shí)現(xiàn)了兩個(gè)數(shù)換位,解引用之后,將地址內(nèi)的值換位。
其過程如下圖:
注意:子函數(shù)的改變能影響到父函數(shù),一定要傳指針和解引用,兩個(gè)條件缺一不可。
int main ()//父函數(shù) { Fun(&a,&b);//子函數(shù) }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)學(xué)生成績等級(jí)劃分的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)學(xué)生成績等級(jí)劃分的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的查找和建立
鏈表是一種物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的查找和建立,感興趣的可以學(xué)習(xí)一下2022-09-09C語言?模擬實(shí)現(xiàn)strlen函數(shù)詳解
在 C 語言 中我們要獲取 字符串 的長度,可以使用strlen 函數(shù),strlen 函數(shù)計(jì)算字符串的長度時(shí),直到空結(jié)束字符,但不包括空結(jié)束字符,因?yàn)?nbsp;strlen 函數(shù)時(shí)不包含最后的結(jié)束字符的,因此一般使用 strlen函數(shù)計(jì)算的字符串的長度會(huì)比使用 sizeof 計(jì)算的字符串的字節(jié)數(shù)要小2022-04-04C/C++實(shí)現(xiàn)獲取系統(tǒng)時(shí)間的示例代碼
C 標(biāo)準(zhǔn)庫提供了 time() 函數(shù)與 localtime() 函數(shù)可以獲取到當(dāng)前系統(tǒng)的日歷時(shí)間。本文將通過一些簡單的示例為大家講講C++獲取系統(tǒng)時(shí)間的具體方法,需要的可以參考一下2022-12-12