是的。這個PPT就是為了說明用void swap2(int x, int y)交換不了通過形參傳入的元素。
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、石鼓網(wǎng)絡(luò)推廣、微信小程序、石鼓網(wǎng)絡(luò)營銷、石鼓企業(yè)策劃、石鼓品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供石鼓建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
為什么交換不了?
因?yàn)関oid swap2(int x, int y)的形式參數(shù)是傳值模式。
C/C++語言規(guī)定:以傳值模式調(diào)用函數(shù),在調(diào)用過程中,函數(shù)需先將形參做一個拷貝,然后基于新的拷貝進(jìn)行計(jì)算。
如上例,執(zhí)行調(diào)用swap2(a[0],a[1]),swap2會先將a[0]的值拷貝給x,將a[1]的值拷貝給y,然后在函數(shù)體內(nèi)交換x、y的值,這樣對a[0]、a[1]毫無影響。
怎樣通過函數(shù)調(diào)用交換a[0]、a[1]的值?
答案是:通過傳引用調(diào)用,即將函數(shù)聲明為void swap2(int x, int y)。
C++語言規(guī)定:引用可以看作是變量的別名。別名類似于人的小名之類,一個人大名、小名雖不同,但都指的是這個人。
同樣如上例,執(zhí)行調(diào)用swap2(a[0],a[1]),swap2將x視作a[0]的別名、將y視作a[1]的別名,這樣在函數(shù)體內(nèi)交換x、y的值,實(shí)際上交換的是a[0]、a[1]的值。
引用是C++語言引入的特性,C語言中沒有引用。若要用C語言實(shí)現(xiàn)通過函數(shù)交換a[0]、a[1]的值,怎么辦?
答案是:模擬傳引用調(diào)用,即將函數(shù)聲明為void swap2(int* xp, int* yp)。
模擬傳引用調(diào)用本質(zhì)上仍是傳值調(diào)用,只不過傳入函數(shù)的是原始參數(shù)的地址。
同樣如上例,執(zhí)行調(diào)用swap2(a+0,a+1),a+0是a[0]的地址,a+1是a[1]的地址。相應(yīng)地,swap將a[0]的地址值拷貝一份給xp,將a[1]的地址值拷貝一份給yp。函數(shù)體內(nèi),swap2通過xp、yp即a[0]、a[1]的地址的新拷貝,操縱a[0]、a[1]的值。
這種方式除了需要改造swap2的聲明,還需改造swap2的函數(shù)體,即其實(shí)現(xiàn)。
C語言中一個函數(shù)(function)是一個可以從程序其它地方調(diào)用執(zhí)行的語句塊。
1、通過使用函數(shù)(functions)我們可以把我們的程序以更模塊化的形式組織起來,從而利用C語言所支持的結(jié)構(gòu)化程序設(shè)計(jì)。
2、從數(shù)學(xué)角度,函數(shù)即集合A和集合B之間的映射關(guān)系。實(shí)際上計(jì)算機(jī)中的函數(shù)概念也是源于此,因此,一般函數(shù),都有形參和返回值。
3、從計(jì)算機(jī)組成原理的角度來看,函數(shù)即是一個小型的計(jì)算機(jī)系統(tǒng),依據(jù)馮諾伊曼的“存儲程序原理”,每一個計(jì)算機(jī)系統(tǒng)包含:輸入系統(tǒng)、輸出系統(tǒng)、運(yùn)算器以及控制器,實(shí)際上對于C語言中的函數(shù)來說,它是“存儲程序原理”的軟實(shí)現(xiàn),其中形參、實(shí)參這是輸入系統(tǒng),返回值是輸出系統(tǒng),函數(shù)體中的運(yùn)算符,比如+、-、*、/四則運(yùn)算即為運(yùn)算器,而邏輯運(yùn)算符以及if、while等控制語句便是一個控制器。
字符處理函數(shù)
本類別函數(shù)用于對單個字符進(jìn)行處理,包括字符的類別測試和字符的大小寫轉(zhuǎn)換
頭文件 ctype.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
字符測試 是否字母和數(shù)字 isalnum
是否字母 isalpha
是否控制字符 iscntrl
是否數(shù)字 isdigit
是否可顯示字符(除空格外) isgraph
是否可顯示字符(包括空格) isprint
是否既不是空格,又不是字母和數(shù)字的可顯示字符 ispunct
是否空格 isspace
是否大寫字母 isupper
是否16進(jìn)制數(shù)字(0-9,A-F)字符 isxdigit
字符大小寫轉(zhuǎn)換函數(shù) 轉(zhuǎn)換為大寫字母 toupper
轉(zhuǎn)換為小寫字母 tolower
地區(qū)化
本類別的函數(shù)用于處理不同國家的語言差異。
頭文件 local.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
地區(qū)控制 地區(qū)設(shè)置 setlocale
數(shù)字格式約定查詢 國家的貨幣、日期、時(shí)間等的格式轉(zhuǎn)換 localeconv
數(shù)學(xué)函數(shù)
本分類給出了各種數(shù)學(xué)計(jì)算函數(shù),必須提醒的是ANSI C標(biāo)準(zhǔn)中的數(shù)據(jù)格式并不符合IEEE754標(biāo)準(zhǔn),一些C語言編譯器卻遵循IEEE754(例如frinklin C51)
頭文件 math.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
錯誤條件處理 定義域錯誤(函數(shù)的輸入?yún)?shù)值不在規(guī)定的范圍內(nèi))
值域錯誤(函數(shù)的返回值不在規(guī)定的范圍內(nèi))
三角函數(shù) 反余弦 acos
反正弦 asin
反正切 atan
反正切2 atan2
余弦 cos
正弦 sin
正切 tan
雙曲函數(shù) 雙曲余弦 cosh
雙曲正弦 sinh
雙曲正切 tanh
指數(shù)和對數(shù) 指數(shù)函數(shù) exp
指數(shù)分解函數(shù) frexp
乘積指數(shù)函數(shù) fdexp
自然對數(shù) log
以10為底的對數(shù) log10
浮點(diǎn)數(shù)分解函數(shù) modf
冪函數(shù) 冪函數(shù) pow
平方根函數(shù) sqrt
整數(shù)截?cái)?,絕對值和求余數(shù)函數(shù) 求下限接近整數(shù) ceil
絕對值 fabs
求上限接近整數(shù) floor
求余數(shù) fmod
本分類函數(shù)用于實(shí)現(xiàn)在不同底函數(shù)之間直接跳轉(zhuǎn)代碼。 頭文件 setjmp.h io.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
保存調(diào)用環(huán)境 setjmp
恢復(fù)調(diào)用環(huán)境 longjmp
信號處理
該分類函數(shù)用于處理那些在程序執(zhí)行過程中發(fā)生例外的情況。
頭文件 signal.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
指定信號處理函數(shù) signal
發(fā)送信號 raise
可變參數(shù)處理
本類函數(shù)用于實(shí)現(xiàn)諸如printf,scanf等參數(shù)數(shù)量可變底函數(shù)。
頭文件 stdarg.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
可變參數(shù)訪問宏 可變參數(shù)開始宏 va_start
可變參數(shù)結(jié)束宏 va_end
可變參數(shù)訪問宏 訪問下一個可變參數(shù)宏 va_arg
輸入輸出函數(shù)
該分類用于處理包括文件、控制臺等各種輸入輸出設(shè)備,各種函數(shù)以“流”的方式實(shí)現(xiàn)
頭文件 stdio.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
文件操作
刪除文件 remove
修改文件名稱 rename
生成臨時(shí)文件名稱 tmpfile
得到臨時(shí)文件路徑 tmpnam
文件訪問 關(guān)閉文件 fclose
刷新緩沖區(qū) fflush
打開文件 fopen
將已存在的流指針和新文件連接 freopen
設(shè)置磁盤緩沖區(qū) setbuf
設(shè)置磁盤緩沖區(qū) setvbuf
格式化輸入與輸出函數(shù) 格式輸出 fprintf
格式輸入 fscanf
格式輸出(控制臺) printf
格式輸入(控制臺) scanf
格式輸出到緩沖區(qū) sprintf
從緩沖區(qū)中按格式輸入 sscanf
格式化輸出 vfprintf
格式化輸出 vprintf
格式化輸出 vsprintf
字符輸入輸出函數(shù) 輸入一個字符 fgetc
字符串輸入 fgets
字符輸出 fputc
字符串輸出 fputs
字符輸入(控制臺) getc
字符輸入(控制臺) getchar
字符串輸入(控制臺) gets
字符輸出(控制臺) putc
字符輸出(控制臺) putchar
字符串輸出(控制臺) puts
字符輸出到流的頭部 ungetc
直接輸入輸出 直接流讀操作 fread
直接流寫操作 fwrite
文件定位函數(shù) 得到文件位置 fgetpos
文件位置移動 fseek
文件位置設(shè)置 fsetpos
得到文件位置 ftell
文件位置復(fù)零位 remind
錯誤處理函數(shù) 錯誤清除 clearerr
文件結(jié)尾判斷 feof
文件錯誤檢測 ferror
得到錯誤提示字符串 perror
實(shí)用工具函數(shù)
本分類給出了一些函數(shù)無法按以上分類,但又是編程所必須要的。
頭文件 stdlib.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
字符串轉(zhuǎn)換函數(shù) 字符串轉(zhuǎn)換為整數(shù) atoi
字符串轉(zhuǎn)換為長整數(shù) atol
字符串轉(zhuǎn)換為浮點(diǎn)數(shù) strtod
字符串轉(zhuǎn)換為長整數(shù) strtol
字符串轉(zhuǎn)換為無符號長整型 strtoul
偽隨機(jī)序列產(chǎn)生函數(shù) 產(chǎn)生隨機(jī)數(shù) rand
設(shè)置隨機(jī)函數(shù)的起動數(shù)值 srand
存儲管理函數(shù) 分配存儲器 calloc
釋放存儲器 free
存儲器分配 malloc
重新分配存儲器 realloc
環(huán)境通信 中止程序 abort
退出程序執(zhí)行,并清除環(huán)境變量 atexit
退出程序執(zhí)行 exit
讀取環(huán)境參數(shù) getenv
程序掛起,臨時(shí)執(zhí)行一個其他程序 system
搜索和排序工具 二分查找(數(shù)據(jù)必須已排序) bsearch
快速排序 qsort
整數(shù)運(yùn)算函數(shù) 求絕對值 abs
div
得到除法運(yùn)算底商和余數(shù)
求長整形底絕對值 labs
求長整形除法的商和余數(shù) ldiv
多字節(jié)字符函數(shù) 得到多字節(jié)字符的字節(jié)數(shù) mblen
得到多字節(jié)字符的字節(jié)數(shù) mbtowc
多字節(jié)字符轉(zhuǎn)換 wctomb
多字節(jié)字符的字符串操作 將多字節(jié)串轉(zhuǎn)換為整數(shù)數(shù)組 mbstowcs
將多字節(jié)串轉(zhuǎn)換為字符數(shù)組 mcstowbs
字符串處理
本分類的函數(shù)用于對字符串進(jìn)行合并、比較等操作
頭文件 string.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
字符串拷貝 塊拷貝(目的和源存儲區(qū)不可重疊) memcpy
塊拷貝(目的和源存儲區(qū)可重疊) memmove
串拷貝 strcpy
按長度的串拷貝 strncpy
字符串連接函數(shù) 串連接 strcat
按長度連接字符串 strncat
串比較函數(shù) 塊比較 memcmp
字符串比較 strcmp
字符串比較(用于非英文字符) strcoll
按長度對字符串比較 strncmp
字符串轉(zhuǎn)換 strxfrm
字符與字符串查找 字符查找 memchr
字符查找 strchr
字符串查找 strcspn
字符串查找 strpbrk
字符串查找 strspn
字符串查找 strstr
字符串分解 strtok
雜類函數(shù) 字符串設(shè)置 memset
錯誤字符串映射 strerror
求字符串長度 strlen
日期和時(shí)間函數(shù)
本類別給出時(shí)間和日期處理函數(shù)
頭文件 time.h
函數(shù)列表
函數(shù)類別 函數(shù)用途 詳細(xì)說明
時(shí)間操作函數(shù) 得到處理器時(shí)間 clock
得到時(shí)間差 difftime
設(shè)置時(shí)間 mktime
得到時(shí)間 time
時(shí)間轉(zhuǎn)換函數(shù) 得到以ASCII碼表示的時(shí)間 asctime
得到字符串表示的時(shí)間 ctime
得到指定格式的時(shí)間 strftime
函數(shù)庫未來的發(fā)展方向
本部分用于說明各類別函數(shù)庫在將來如何發(fā)展。
序號 庫類別 頭文件 詳細(xì)說明
1 錯誤處理 errno.h
2 字符處理 ctype.h
3 地區(qū)化 local.h
4 數(shù)學(xué)函數(shù) math.h
5 信號處理 signal.h
6 輸入輸出 stdio.h
7 實(shí)用工具程序 stdlib.h
8 字符串處理 string.h
#include?stdio.h
#include?math.h
double?mysqrt(double?a,?double?x0)
{
if?(a0)return?-1;
double?x1?=?1.0?/?2?*?(x0?+?a?/?x0);
if?(fabs(x1?-?x0)??1e-5)return?x1;
return?mysqrt(a,?x1);
}
int?main()
{
double?a,?x0?=?1.0;
printf("Enter?a:");
scanf("%lf",?a);
printf("The?sqrt?of?%lf=%lf\n",?a,?mysqrt(a,?x0));
return?0;
}