版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ChapChap8 8-1 -1 善于利用指針善于利用指針【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University2主要內(nèi)容主要內(nèi)容F地址和指針的概念地址和指針的概念F變量的指針和指向變量的指針變量變量的指針和指向變量的指針變量F數(shù)組的指針和指向數(shù)組的指針變量數(shù)組的指針和指向數(shù)組的指針變量F字符串的指針和指向字符串的指針變量字符串的指針和指向字符串的指針變量F函數(shù)的指針和指向函數(shù)的指針變量函數(shù)的指針和指向函數(shù)的指針變量F返回指針值的函數(shù)返回指針值的函數(shù)F指針數(shù)組和指向指
2、針的指針指針數(shù)組和指向指針的指針F有關(guān)指針的數(shù)據(jù)類型和指針運(yùn)算的小結(jié)有關(guān)指針的數(shù)據(jù)類型和指針運(yùn)算的小結(jié)F習(xí)題習(xí)題【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University38.1 指針是什么【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University4地址和指針的概念地址和指針的概念F變量定義時(shí)的內(nèi)存分配變量定義時(shí)的內(nèi)存分配a如果在程序中定義了一個(gè)變量
3、,在編如果在程序中定義了一個(gè)變量,在編譯時(shí)就給這個(gè)變量分配內(nèi)存單元。系譯時(shí)就給這個(gè)變量分配內(nèi)存單元。系統(tǒng)根據(jù)程序中定義的變量類型,分配統(tǒng)根據(jù)程序中定義的變量類型,分配一定長(zhǎng)度的空間。一定長(zhǎng)度的空間。F內(nèi)存單元的地址和內(nèi)存單元的內(nèi)內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容這兩個(gè)概念的區(qū)別容這兩個(gè)概念的區(qū)別a內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是這就是“地址地址”,它相當(dāng)于旅館,它相當(dāng)于旅館中的房間號(hào)。中的房間號(hào)。a在地址所標(biāo)志的內(nèi)存單元中存放在地址所標(biāo)志的內(nèi)存單元中存放數(shù)據(jù),這相當(dāng)于旅館中各個(gè)房間數(shù)據(jù),這相當(dāng)于旅館中各個(gè)房間中居住旅客一樣。中居住旅客一樣?!疽痪S字符數(shù)組】不使用字
4、符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University5地址和指針的概念地址和指針的概念F變量的變量的“直接訪問直接訪問”方式通過變量名來訪問方式通過變量名來訪問a在程序中一般是通過變量名來對(duì)內(nèi)存單元進(jìn)行存取操作的。其實(shí)在程序中一般是通過變量名來對(duì)內(nèi)存單元進(jìn)行存取操作的。其實(shí)程序經(jīng)過編譯以后己經(jīng)將變量名轉(zhuǎn)換為變量的地址,對(duì)變量值的程序經(jīng)過編譯以后己經(jīng)將變量名轉(zhuǎn)換為變量的地址,對(duì)變量值的存取都是通過地址進(jìn)行的。存取都是通過地址進(jìn)行的。F變量的變量的“間接訪問間接訪問”方式方式保存變量地址的變量
5、:保存變量地址的變量:i_pointer=&i;i_pointer=&i;這時(shí),這時(shí),i_pointeri_pointer的值就是的值就是20002000,即變量,即變量i i所占用單元的起始地址。所占用單元的起始地址。變量的變量的“間接訪問間接訪問”過程過程:先找到存放先找到存放“i i的地址的地址”的變量,即的變量,即i_pointeri_pointer,從中取出,從中取出i i的地址的地址(2000)(2000),然后到,然后到20002000、20012001字節(jié)取出字節(jié)取出i i的值的值(3)(3)。【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子
6、字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University6地址和指針的概念地址和指針的概念F“直接訪問直接訪問”和和“間接訪問間接訪問”方式下變量的存儲(chǔ)過程方式下變量的存儲(chǔ)過程為了表示將數(shù)值為了表示將數(shù)值3 3送到變量中,可以有兩種表達(dá)方法送到變量中,可以有兩種表達(dá)方法: :(1) (1) 將將3 3送到變量送到變量i i所標(biāo)志的單元中。所標(biāo)志的單元中。(2) (2) 將將3 3送到變量送到變量i_pointeri_pointer所所“指向指向”的單元的單元( (即即i i所標(biāo)志的單元所標(biāo)志的單元) )中。中。見上圖。所謂見上圖。所謂“
7、指向指向”就是通過地址來體現(xiàn)的。就是通過地址來體現(xiàn)的。F“指針指針”和和“指針變量指針變量”一個(gè)變量的地址稱為該變量的一個(gè)變量的地址稱為該變量的“指針指針”。如果有一個(gè)變量專門用來存放另一變量的地址如果有一個(gè)變量專門用來存放另一變量的地址( (即指針即指針) ),則它稱,則它稱為為“指針變量指針變量”。指針變量的值指針變量的值( (即指針變量中存放的值即指針變量中存放的值) )是指針是指針( (地址地址) )。請(qǐng)區(qū)分。請(qǐng)區(qū)分“指針指針”和和“指針變量指針變量”這兩個(gè)概念。這兩個(gè)概念?!疽痪S字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)S
8、oochow UniversitySoochow University78.2 指針變量【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University8定義一個(gè)指針變量定義一個(gè)指針變量F指針變量也必須指針變量也必須先先定義后定義后使用使用F定義指針變量的一般形式:定義指針變量的一般形式:a基類型基類型 * *指針變量名指針變量名F指針變量的基類型:指針變量的基類型:a用來指定該指針變量可以指向的變量的類型。用來指定該指針變量可以指向的變量的類型。a指針變量只能用來指向和其基類
9、型指針變量只能用來指向和其基類型的變量,如基類型為的變量,如基類型為intint的指針變量只能用來指向整型變量,的指針變量只能用來指向整型變量,。aintint* *pointer_1pointer_1,* *pointer_2, a;pointer_2, a;a用賦值語句可使一個(gè)指針變量指向另一個(gè)變量用賦值語句可使一個(gè)指針變量指向另一個(gè)變量【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University9在定義指針變量時(shí)要注意兩點(diǎn)在定義指針變量時(shí)要注意兩點(diǎn)F(1) (1) 指
10、針變量前面的指針變量前面的“* *”,表示該變量的類型為,表示該變量的類型為指針型變量。指針型變量。a注意:注意:指針變量名是指針變量名是pointer_1pointer_1、pointer_2pointer_2,而不是,而不是* *pointer_1pointer_1、* *pointer_2pointer_2。F(2) (2) 在定義指針變量時(shí)必須指定基類型。例如只在定義指針變量時(shí)必須指定基類型。例如只有整型變量的地址才能放到指向整型變量的指針有整型變量的地址才能放到指向整型變量的指針變量中。變量中?!疽痪S字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言
11、程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University10指針變量的引用指針變量的引用F指針變量中只能存放地址指針變量中只能存放地址( (指針指針) ),不要隨便將一個(gè)整型常不要隨便將一個(gè)整型常量量( (或任何其他非地址類型的數(shù)據(jù)或任何其他非地址類型的數(shù)據(jù)) )賦給一個(gè)指針變量賦給一個(gè)指針變量。F兩個(gè)有關(guān)的運(yùn)算符兩個(gè)有關(guān)的運(yùn)算符a(1) &(1) &: 取地址運(yùn)算符。取地址運(yùn)算符。a(2) (2) * *: 指針運(yùn)算符指針運(yùn)算符( (或稱或稱“間接訪問間接訪問”運(yùn)算符運(yùn)算符) )。例如:例如:&a&a為變量為變量a a的地址
12、,的地址,* *p p為指針變量為指針變量p p所指向的存儲(chǔ)單元。所指向的存儲(chǔ)單元。F注意:指針使用前必須先初始化!注意:指針使用前必須先初始化!apointer_1 = &i;pointer_1 = &i;注意:注意:規(guī)則修改:指針必須先定義并且初始化后,才可以使用規(guī)則修改:指針必須先定義并且初始化后,才可以使用【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University11指針變量的引用程序舉例指針變量的引用程序舉例例:通過指針變量訪問整型變量。例:通過
13、指針變量訪問整型變量。main( ) int a,B, *pointer_1, *pointer_2; /*這里出現(xiàn)這里出現(xiàn)*表示指針定義表示指針定義*/ a=100;B=10; /*把變量把變量a的地址賦給的地址賦給pointer_1,不是,不是*pointer_1=&a */ pointer_1=&a;/*把變量把變量B的地址賦給的地址賦給pointer_2,不是不是*pointer_2=&a */ pointer_2=&B; printf(%d,%dn,a,B); /*這里出現(xiàn)的這里出現(xiàn)的*表示對(duì)指針的使用表示對(duì)指針的使用*/ printf(“%d,%dn
14、”,*pointer_1,*pointer_2); /這里會(huì)出現(xiàn)什么結(jié)果這里會(huì)出現(xiàn)什么結(jié)果? prinft(“%d,%dn”, pointer_1, pointer_2); 運(yùn)行結(jié)果為:運(yùn)行結(jié)果為:100,10100,10【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University12對(duì)對(duì)“&”和和“*”運(yùn)算符的深入說明運(yùn)算符的深入說明F(1) (1) 如果已執(zhí)行了如果已執(zhí)行了“pointer_1=&a;”pointer_1=&a;”語句,若有語句,
15、若有& &* *pointer_1pointer_1它的含義是什么?它的含義是什么?a& &* *pointer_1pointer_1相當(dāng)于相當(dāng)于&a&aapointer_2 = &pointer_2 = &* *pointer_1pointer_1apointer_2 = pointer_1pointer_2 = pointer_1【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University13F(2) (2
16、) * *&a&a的含義是什么?的含義是什么?a與與a a等價(jià)等價(jià); * *&a&a和和* *pointer_1pointer_1的作用是一樣的的作用是一樣的( (假設(shè)已執(zhí)行了假設(shè)已執(zhí)行了“pointer_1=&a”)pointer_1=&a”),它們等價(jià)于變量,它們等價(jià)于變量a a。即。即* *&a&a與與a a等價(jià),見圖等價(jià),見圖F(3) (3) (* *pointer_1)+pointer_1)+相當(dāng)于相當(dāng)于a+a+。注意括號(hào)是必要的,如果。注意括號(hào)是必要的,如果沒有括號(hào),就成為了沒有括號(hào),就成為了* *pointer_1+
17、pointer_1+,+和和* *為同一優(yōu)先級(jí)為同一優(yōu)先級(jí)別,相當(dāng)于先做別,相當(dāng)于先做* *pointer_1pointer_1,然后做,然后做pointer_1+pointer_1+對(duì)對(duì)“&”和和“*”運(yùn)算符的深入說明運(yùn)算符的深入說明【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University14例:例: 輸入輸入a和和B兩個(gè)整數(shù),按先大后小的順序輸出兩個(gè)整數(shù),按先大后小的順序輸出a和和B。main()int *p1,*p2,*p, a, B;scanf ( %d
18、,%d, &a, &B);p1=&a; p2=&B;if(aB) p=p1; p1=p2; p2=p; printf(na=%D,B=%Dnn,a,B); printf(max=%D,min=%Dn,*p1,*p2); 運(yùn)行情況如下:運(yùn)行情況如下:5,9a=5,B=9max=9,min=5 當(dāng)輸入當(dāng)輸入a=5,B=9時(shí),由于時(shí),由于aB,將,將p1和和p2交換。交換前的情況見圖交換。交換前的情況見圖 (a),交換后見圖,交換后見圖(b)。結(jié)論:在使用指針時(shí),結(jié)論:在使用指針時(shí),我們要清楚操作的是指我們要清楚操作的是指針本身,還是指針?biāo)羔槺旧恚€是指針?biāo)赶虻淖?/p>
19、量向的變量【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University15函數(shù)的參數(shù)回顧函數(shù)的參數(shù)回顧F形式參數(shù)和實(shí)際參數(shù)形式參數(shù)和實(shí)際參數(shù)a二者具有各自獨(dú)立的內(nèi)存空間二者具有各自獨(dú)立的內(nèi)存空間aC C語言中函數(shù)參數(shù)傳值是單向的語言中函數(shù)參數(shù)傳值是單向的實(shí)際參數(shù)實(shí)際參數(shù) 形式參數(shù)形式參數(shù)F例如:例如:void swap(int n1,int n2) int temp; if (n1 n2) temp = n1; n1 = n2; n2 = temp;void main()
20、int a,b; scanf(%d%d,&a,&b); printf(a=%d; b=%d,a,b); swap(a,b); printf(a=%d; b=%d,a,b);輸入輸入: 9 5輸出輸出: a=9; b=5輸出輸出: a=9; b=5【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University16函數(shù)的參數(shù)回顧函數(shù)的參數(shù)回顧F函數(shù)的調(diào)用過程函數(shù)的調(diào)用過程a首先把首先把a(bǔ) a、b b的值復(fù)制到的值復(fù)制到swapswap函數(shù)函數(shù)的堆棧區(qū)間,并賦值給行
21、參的堆棧區(qū)間,并賦值給行參n1n1、n2.n2.a交換交換n1n1、n2n2的值。的值。a返回。返回。95調(diào)用函數(shù)運(yùn)行狀態(tài)返回地址9 / 55 / 99main() swap() abn1n2temp棧區(qū)結(jié)果結(jié)果被調(diào)函數(shù)進(jìn)行的操作被調(diào)函數(shù)進(jìn)行的操作結(jié)果無法反應(yīng)在主調(diào)函結(jié)果無法反應(yīng)在主調(diào)函數(shù)中。數(shù)中。用傳地址的形式用傳地址的形式【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University17指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)F指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)a將一個(gè)變量的地址傳
22、到另一個(gè)函數(shù)中。將一個(gè)變量的地址傳到另一個(gè)函數(shù)中。F例如:例如:void swapp(int *n1,int *n2) int temp; if (*n1 *n2) temp = *n1; *n1 = *n2; *n2 = temp;void main() int a,b; scanf(%d%d,&a,&b); printf(a=%d; b=%d,a,b); swapp(&a,&b); printf(a=%d; b=%d,a,b);輸入輸入: 9 5輸出輸出: a=9; b=5輸出輸出: a=5; b=9【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中
23、是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University18指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)F函數(shù)的調(diào)用過程函數(shù)的調(diào)用過程a首先把首先把a(bǔ) a、b b的地址值復(fù)制到的地址值復(fù)制到swappswapp函函數(shù)的堆棧區(qū)間,并賦值給行參數(shù)的堆棧區(qū)間,并賦值給行參n1n1、n2.n2.a交換交換n1n1、n2n2所指向內(nèi)存單元的值。所指向內(nèi)存單元的值。a返回。返回。結(jié)果結(jié)果被調(diào)函數(shù)進(jìn)行的操作結(jié)果反應(yīng)被調(diào)函數(shù)進(jìn)行的操作結(jié)果反應(yīng)在主調(diào)函數(shù)中。在主調(diào)函數(shù)中。被調(diào)函數(shù)實(shí)際上是在主調(diào)函數(shù)被調(diào)函數(shù)實(shí)際上是在主調(diào)函數(shù)的堆棧區(qū)間中進(jìn)行的操作的堆棧區(qū)間中
24、進(jìn)行的操作實(shí)際是一種地址傳遞方式實(shí)際是一種地址傳遞方式95調(diào)用函數(shù)運(yùn)行狀態(tài)返回地址200820049main() swap() abn1n2temp棧區(qū)20042008【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University19指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)F指針變量作為函數(shù)參數(shù)典型錯(cuò)誤舉例一指針變量作為函數(shù)參數(shù)典型錯(cuò)誤舉例一swap(swap(intint * *n1n1,intint * *n2)n2) intint* *temp;temp;* *temp=tem
25、p=* *n1; n1; * *n1=n1=* *n2;n2; * *n2=n2=* *temp;temp; F問題:?jiǎn)栴}:atemptemp沒有初始化,指向的內(nèi)存單元是不確定的沒有初始化,指向的內(nèi)存單元是不確定的【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University20指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)F指針變量作為函數(shù)參數(shù)典型錯(cuò)誤舉例二指針變量作為函數(shù)參數(shù)典型錯(cuò)誤舉例二swap(int swap(int * *n1n1,int int * *n2)n2) int i
26、nt* *p; p; p=n1;p=n1;n1=n2;n1=n2;n2=p;n2=p; 95調(diào)用函數(shù)運(yùn)行狀態(tài)返回地址2008 / 20042004 / 20082008main() swap() abn1n2 p棧區(qū)20042008問題問題交換的只是兩個(gè)形參所指向的內(nèi)存單元。交換的只是兩個(gè)形參所指向的內(nèi)存單元?!疽痪S字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University21指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)F C語言中實(shí)參變量和形參變量之間的數(shù)據(jù)傳遞是語言中實(shí)參變量和
27、形參變量之間的數(shù)據(jù)傳遞是單向的單向的“值傳遞值傳遞”方式。方式。指針變量作函數(shù)參數(shù)也指針變量作函數(shù)參數(shù)也要遵循這一規(guī)則,這時(shí)的值是指針的值,也就是要遵循這一規(guī)則,這時(shí)的值是指針的值,也就是地址值。地址值。F 調(diào)用函數(shù)不可能改變實(shí)參指針變量的值,但可以調(diào)用函數(shù)不可能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指變量的值。改變實(shí)參指針變量所指變量的值。F 運(yùn)用指針變量作參數(shù),可以從函數(shù)調(diào)用中得到多運(yùn)用指針變量作參數(shù),可以從函數(shù)調(diào)用中得到多個(gè)變化了的值。如果不用指針變量是難以做到這個(gè)變化了的值。如果不用指針變量是難以做到這一點(diǎn)的。參考下例:一點(diǎn)的。參考下例:【一維字符數(shù)組】不使用字符串處理函數(shù),判
28、斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University22指針作函數(shù)參數(shù)的實(shí)例指針作函數(shù)參數(shù)的實(shí)例main() int a,B,C,*p1,*p2,*p3;scanf(%d,%d,%d,&a,&B,&C);p1=&a; p2=&B; p3=&C;exchange(p1,p2,p3);printf(n%d,%d,%dn,a,B,C);swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=tem
29、p;exchange(int *q1, int *q2, int *q3) if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3);運(yùn)行情況如下:運(yùn)行情況如下: 9,0,10 10,9,0指針舉例指針舉例F編寫一個(gè)函數(shù),實(shí)現(xiàn)將大寫字母轉(zhuǎn)換從小寫字母編寫一個(gè)函數(shù),實(shí)現(xiàn)將大寫字母轉(zhuǎn)換從小寫字母,小寫字母轉(zhuǎn)換成大寫字母。,小寫字母轉(zhuǎn)換成大寫字母。F在在mainmain函數(shù)中測(cè)試該函數(shù)的正確性。函數(shù)中測(cè)試該函數(shù)的正確性。C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow Universi
30、ty23【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University248.3 通過指針引用數(shù)組【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University25數(shù)組的指針和指向數(shù)組的指針變量數(shù)組的指針和指向數(shù)組的指針變量F數(shù)組的指針數(shù)組的指針是指數(shù)組的起始地址是指數(shù)組的起始地址F數(shù)組元素的指針數(shù)組元素的指針是數(shù)組元素的地址。是數(shù)組元素的地址。F指向數(shù)組元
31、素的指針指向數(shù)組元素的指針a定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指向變定義一個(gè)指向數(shù)組元素的指針變量的方法,與以前介紹的指向變量的指針變量相同。量的指針變量相同。例如:例如:int a10;int a10; int int * *p; p; p=&a0;p=&a0;【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University26指向數(shù)組元素的指針指向數(shù)組元素的指針FC C語言規(guī)定數(shù)組名代表數(shù)組的首地址,也就是第語言規(guī)定數(shù)組名代表數(shù)組的首地址,也
32、就是第0 0號(hào)元素的地址。號(hào)元素的地址。下面語句等價(jià):下面語句等價(jià):p=&a0;p=&a0;p=a; p=a; 或者或者int int * *p = &a0;p = &a0;int int * *p = a;p = a;a注意注意數(shù)組名數(shù)組名a a不代表整個(gè)數(shù)組,上述不代表整個(gè)數(shù)組,上述“p=a;”p=a;”的作用是的作用是“把把a(bǔ) a數(shù)組的數(shù)組的首地址賦給指針變量首地址賦給指針變量p”p”,而不是,而不是“把數(shù)組把數(shù)組a a各元素的值賦給各元素的值賦給p”p”。【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語
33、言程序設(shè)計(jì)Soochow UniversitySoochow University27通過指針引用數(shù)組元素通過指針引用數(shù)組元素F通過指針對(duì)數(shù)組元素賦通過指針對(duì)數(shù)組元素賦值,如:值,如:* *p=1;p=1;F如果指針變量如果指針變量p p已指向已指向數(shù)組中的一個(gè)元素,則數(shù)組中的一個(gè)元素,則p+1p+1指向同一數(shù)組中的指向同一數(shù)組中的下一個(gè)元素下一個(gè)元素( (而不是將而不是將p p值簡(jiǎn)單地加值簡(jiǎn)單地加1) 1)?!疽痪S字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University28
34、數(shù)組元素指針使用的進(jìn)一步理解數(shù)組元素指針使用的進(jìn)一步理解如果如果p p的初值為的初值為&a0&a0,則:則:F(1) p+i(1) p+i和和a+ia+i就是就是aiai的地址的地址F(2) (2) * *(p+i)(p+i)或或* *(a+i)(a+i)是是p+ip+i或或a+ia+i所指向的數(shù)組元素,即所指向的數(shù)組元素,即aiai。例。例如,如,* *(p+5)(p+5)或或* *(a+5)(a+5)就是就是a5a5。F(3) (3) 指向數(shù)組的指針變量也可以帶下標(biāo),如指向數(shù)組的指針變量也可以帶下標(biāo),如pipi與與* *(p+i)(p+i)等價(jià)等價(jià)數(shù)組元素引用的兩種方法:數(shù)
35、組元素引用的兩種方法:F(1) (1) 下標(biāo)法,如下標(biāo)法,如aiai或或pipi形式,形式,p p是指向數(shù)組的指針變量,其是指向數(shù)組的指針變量,其初值初值p=ap=a。F(2) (2) 指針法,如指針法,如* *(a+i)(a+i)或或* *(p+i)(p+i)。其中。其中a a是數(shù)組名,是數(shù)組名,p p是指向數(shù)是指向數(shù)組的指針變量,其初值組的指針變量,其初值p=ap=a?!疽痪S字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University29數(shù)組元素指針使用例子數(shù)組元素指針使用例
36、子例例: 輸出數(shù)組中的全部元素。假設(shè)有一個(gè)整型數(shù)組輸出數(shù)組中的全部元素。假設(shè)有一個(gè)整型數(shù)組a,有,有10個(gè)個(gè)元素。要輸出各元素的值有三種方法:元素。要輸出各元素的值有三種方法:(1) 下標(biāo)法。下標(biāo)法。main( ) int a10; inti; for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i+) printf(“%d ”,ai);(2)數(shù)組名方法數(shù)組名方法main( ) int a10; inti; for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i+) prin
37、tf(“%d ”, *(a+i);(3)指針方法指針方法main( ) int a10; inti; int *p;for(i=0;i10;i+) scanf(“%d”,p+i);printf(n);for(p=a;p(a+10);p+) printf(%d ,*p);【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University30數(shù)組元素的指針變量使用過程中的注意事項(xiàng)數(shù)組元素的指針變量使用過程中的注意事項(xiàng)(1) 指針變量可以實(shí)現(xiàn)使本身的值改變,數(shù)組名是指針變量可以實(shí)現(xiàn)使本
38、身的值改變,數(shù)組名是否也可以?否也可以? 例如,上述第例如,上述第(3)種方法是用指針變量種方法是用指針變量p來指向元素,用來指向元素,用p+使使p的值不斷改變,這是合法的。如果不用的值不斷改變,這是合法的。如果不用p而使而使a變化變化(例如,用例如,用a+)行不行呢?行不行呢? 答案是不行的答案是不行的,因?yàn)?,因?yàn)閍是數(shù)組首地址,這個(gè)地址在編譯是數(shù)組首地址,這個(gè)地址在編譯期就定下來了,在程序運(yùn)行過程中始終會(huì)保持不變。程期就定下來了,在程序運(yùn)行過程中始終會(huì)保持不變。程序中如果出現(xiàn)序中如果出現(xiàn)a+,編譯器在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。,編譯器在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。(2) 要注意指針變量的當(dāng)前值要注意指針
39、變量的當(dāng)前值。(3) 注意數(shù)組下標(biāo)越界問題注意數(shù)組下標(biāo)越界問題 (4) 注意指針變量的運(yùn)算注意指針變量的運(yùn)算(見見P236) 【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University31例例:通過指針變量輸出通過指針變量輸出a數(shù)組的數(shù)組的10個(gè)元素個(gè)元素請(qǐng)檢查以下程序的正確性:請(qǐng)檢查以下程序的正確性:main( ) int*p,i,a10; p=a; for(i=0;i10;i+) scanf(%d”, p+); printf(n); for(i=0;i10;i+,p+
40、) printf(“%d”, *p);p=a;數(shù)組元素的指針變量使用過程中的注意事項(xiàng)數(shù)組元素的指針變量使用過程中的注意事項(xiàng)【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University32用數(shù)組名作函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù) 數(shù)組名可以用作函數(shù)的形參和實(shí)參。數(shù)組名可以用作函數(shù)的形參和實(shí)參。如:如:main( ) f(int arr ,int n) int array10; f(array,10); 當(dāng)用數(shù)組名作參數(shù)時(shí),如果形參數(shù)組中各元素的值發(fā)生變當(dāng)用數(shù)組名作參數(shù)時(shí),如果形參
41、數(shù)組中各元素的值發(fā)生變化,實(shí)參數(shù)組元素的值隨之變化?;?,實(shí)參數(shù)組元素的值隨之變化。 實(shí)參數(shù)組名代表該數(shù)組首地址,而形參是用來接收從實(shí)實(shí)參數(shù)組名代表該數(shù)組首地址,而形參是用來接收從實(shí)參傳遞過來的數(shù)組首地址的。因此,形參應(yīng)該是一個(gè)指參傳遞過來的數(shù)組首地址的。因此,形參應(yīng)該是一個(gè)指針變量。針變量。 實(shí)際上,實(shí)際上,C編譯都是將形參數(shù)組作為指針變量來處理的。編譯都是將形參數(shù)組作為指針變量來處理的。f(int arr , int n)實(shí)際上相當(dāng)于實(shí)際上相當(dāng)于f(int *arr, int n) 【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)
42、Soochow UniversitySoochow University33實(shí)參數(shù)組名和形參數(shù)組名的區(qū)別:實(shí)參數(shù)組名和形參數(shù)組名的區(qū)別:實(shí)參數(shù)組名代表一個(gè)固定的地址,或者說是指針型實(shí)參數(shù)組名代表一個(gè)固定的地址,或者說是指針型常量,而形參數(shù)組并不是一個(gè)固定的地址值。如:常量,而形參數(shù)組并不是一個(gè)固定的地址值。如: f(int arr , int n) printf(%dn, *arr); /*輸出輸出array0的值,的值,*/arr=arr+3;printf(%dn, *arr); /*輸出輸出array3的值,的值,*/【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符
43、串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University34用數(shù)組名作函數(shù)參數(shù)舉例用數(shù)組名作函數(shù)參數(shù)舉例例例:設(shè)計(jì)一個(gè)函數(shù)將:設(shè)計(jì)一個(gè)函數(shù)將數(shù)組數(shù)組a中中n個(gè)整數(shù)按相反順序存放,個(gè)整數(shù)按相反順序存放,見下圖示意。見下圖示意。 解此題的算法為:將解此題的算法為:將a0與與an-1對(duì)換,再將對(duì)換,再將a1與與an-2對(duì)對(duì),直到將下圖中的,直到將下圖中的a(n-1)/2與與 an-int(n-1)/2)-1對(duì)換對(duì)換。 程序程序: 【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Sooc
44、how UniversitySoochow University35重要?dú)w納重要?dú)w納歸納起來,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的歸納起來,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參的表示形式有以下值,實(shí)參與形參的表示形式有以下4 4種情況:種情況:F(1) (1) 形參和實(shí)參都用數(shù)組名,如:形參和實(shí)參都用數(shù)組名,如:main( ) f(int x main( ) f(int x ,int n)int n) int a10; int a10; f(af(a,10); 10); 可以認(rèn)為有一形參數(shù)組,與實(shí)參數(shù)組共用一段內(nèi)存單元??梢哉J(rèn)為有一形參數(shù)組,與實(shí)參數(shù)組共用
45、一段內(nèi)存單元。【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University36重要?dú)w納重要?dú)w納(2) 實(shí)參用數(shù)組名,形參用指針變量。如:實(shí)參用數(shù)組名,形參用指針變量。如:main( ) f(int *x,int n) int a10; f(a,10); 實(shí)參實(shí)參a為數(shù)組名,形參為數(shù)組名,形參x為指向整型變量的指針變?yōu)橹赶蛘妥兞康闹羔樧兞浚瘮?shù)開始執(zhí)行時(shí),量,函數(shù)開始執(zhí)行時(shí),x指向指向a0,即,即x=&a0。通。通過過x值的改變,可以指向值的改變,可以指向a數(shù)組的任
46、一元素。數(shù)組的任一元素?!疽痪S字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University37重要?dú)w納重要?dú)w納(3) 實(shí)參形參都用指針變量。例如:實(shí)參形參都用指針變量。例如:main( ) f(int *x,int n) int a10, *p; p=a; f(p,10); 實(shí)參實(shí)參p和形參和形參x都是指針變量。先使實(shí)參指針變量都是指針變量。先使實(shí)參指針變量p指向數(shù)組指向數(shù)組a,p的值是的值是&a0。然后將。然后將p的值傳給形的值傳給形參指針變量參指針變量x,x的初始值也
47、是的初始值也是&a0 。通過。通過x值的值的改變可以使改變可以使x指向數(shù)組指向數(shù)組a的任一元素。的任一元素。【一維字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University38重要?dú)w納重要?dú)w納 (4) 實(shí)參為指針變量,形參為數(shù)組名。如:實(shí)參為指針變量,形參為數(shù)組名。如:main() f(int x ,int n) int a10,*p; p=a; f(p,10); 實(shí)參實(shí)參p為指針變量,它使指針變量為指針變量,它使指針變量p指向指向a0,即即p=a或或p=&a0
48、。形參為數(shù)組名。形參為數(shù)組名x,從前面的介紹已知,實(shí)際上將,從前面的介紹已知,實(shí)際上將x作為指針變量處理,今將作為指針變量處理,今將a0的地址傳給形參的地址傳給形參x,使指針,使指針變量變量x指向指向a0。也可以理解為形參數(shù)組。也可以理解為形參數(shù)組x取得取得a數(shù)組的首地?cái)?shù)組的首地址,址,x數(shù)組和數(shù)組和a數(shù)組共用同一段內(nèi)存單元。數(shù)組共用同一段內(nèi)存單元?!疽痪S字符數(shù)組】不使用字符串處理函數(shù),判斷字符串 s1 中是否存在子字符串 s2C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University398.4 通過指針引用字符串C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soo
49、chow UniversitySoochow University40字符串的指針和指向字符串的指針變量字符串的指針和指向字符串的指針變量F字符串的表示形式字符串的表示形式a字符數(shù)組法:字符數(shù)組法:用字符數(shù)組存放一個(gè)字符串。用字符數(shù)組存放一個(gè)字符串。a例如:例如:amain( )main( ) char string=IloveChina char string=IloveChina!; ; printf(%sn printf(%sn,string);string); C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University41字符串的指針和指向字
50、符串的指針變量字符串的指針和指向字符串的指針變量F字符串的表示形式字符串的表示形式a字符指針法字符指針法 :用字符指針指向一個(gè)字符串??梢圆欢x字符數(shù)組,而定義用字符指針指向一個(gè)字符串??梢圆欢x字符數(shù)組,而定義一個(gè)字符指針。用字符指針指向字符串中的字符。一個(gè)字符指針。用字符指針指向字符串中的字符。a例如:例如:main( )main( ) char char* *string=I love China!;string=I love China!;printf(%snprintf(%sn,string);string); FC C語言對(duì)字符串常量是按字符數(shù)組處理的,在內(nèi)存開辟了一個(gè)語言對(duì)字符串
51、常量是按字符數(shù)組處理的,在內(nèi)存開辟了一個(gè)字符數(shù)組用來存放字符串常量。程序在定義字符指針變量字符數(shù)組用來存放字符串常量。程序在定義字符指針變量stringstring時(shí)把字符串首地址時(shí)把字符串首地址( (即存放字符串的字符數(shù)組的首地址即存放字符串的字符數(shù)組的首地址) )賦賦給給stringstring。C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University42字符數(shù)組、字符串和字符指針的理解字符數(shù)組、字符串和字符指針的理解F字符數(shù)組字符數(shù)組a存放字符數(shù)據(jù)的數(shù)組,沒有字符串結(jié)束標(biāo)志存放字符數(shù)據(jù)的數(shù)組,沒有字符串結(jié)束標(biāo)志a在定義時(shí)可以整體初始化,但不能
52、在非定義時(shí)進(jìn)行整體初始化在定義時(shí)可以整體初始化,但不能在非定義時(shí)進(jìn)行整體初始化F字符串字符串a(chǎn)存放于字符數(shù)組中,必須有字符串結(jié)束標(biāo)志存放于字符數(shù)組中,必須有字符串結(jié)束標(biāo)志a字符串在內(nèi)存占有的字節(jié)數(shù)為長(zhǎng)度字符串在內(nèi)存占有的字節(jié)數(shù)為長(zhǎng)度1 1a在定義時(shí)可以整體初始化,但不能在非定義時(shí)進(jìn)行整體初始化在定義時(shí)可以整體初始化,但不能在非定義時(shí)進(jìn)行整體初始化F字符指針字符指針a可以指向字符數(shù)據(jù)的指針變量,可以指向字符數(shù)組,也可以指向字符串可以指向字符數(shù)據(jù)的指針變量,可以指向字符數(shù)組,也可以指向字符串a(chǎn)在定義時(shí)可以初始化,也可以在非定義時(shí)進(jìn)行初始化在定義時(shí)可以初始化,也可以在非定義時(shí)進(jìn)行初始化a必須先初始化
53、,才可以使用必須先初始化,才可以使用F字符串輸出的理解:格式控制符字符串輸出的理解:格式控制符“%s”%s”C C語言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University43字符串指針作函數(shù)參數(shù)字符串指針作函數(shù)參數(shù)F使用字符指針變量和字符數(shù)組的比較使用字符指針變量和字符數(shù)組的比較( (見見P263)P263)F字符串指針作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)的字符串指針作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)的語法規(guī)定完全相同。語法規(guī)定完全相同。Fcopy_stringcopy_string函數(shù)的幾種形式函數(shù)的幾種形式( (見見P2P26161) )F目的:目的:a深刻體
54、會(huì)指針給深刻體會(huì)指針給C C程序帶來的好處程序帶來的好處簡(jiǎn)化程序的編寫工作量,使得程序更簡(jiǎn)潔。簡(jiǎn)化程序的編寫工作量,使得程序更簡(jiǎn)潔。a指針給指針給C C程序帶來的麻煩程序帶來的麻煩需要仔細(xì)控制指針的使用需要仔細(xì)控制指針的使用降低了程序的可讀性降低了程序的可讀性字符指針應(yīng)用舉例字符指針應(yīng)用舉例F例如:例如:a編寫一個(gè)函數(shù),實(shí)現(xiàn)字符串編寫一個(gè)函數(shù),實(shí)現(xiàn)字符串str1str1與字符串與字符串str2str2的比較。的比較。a編寫一個(gè)函數(shù),實(shí)現(xiàn)字符串編寫一個(gè)函數(shù),實(shí)現(xiàn)字符串str1str1與與str2str2的拼接的拼接a編寫一個(gè)函數(shù),求字符串編寫一個(gè)函數(shù),求字符串str1str1的長(zhǎng)度的長(zhǎng)度C C語
55、言程序設(shè)計(jì)語言程序設(shè)計(jì)Soochow UniversitySoochow University44a非靜態(tài)的局部變量是分配在內(nèi)存中的動(dòng)態(tài)存儲(chǔ)區(qū)的,這非靜態(tài)的局部變量是分配在內(nèi)存中的動(dòng)態(tài)存儲(chǔ)區(qū)的,這個(gè)存儲(chǔ)區(qū)是一個(gè)稱為個(gè)存儲(chǔ)區(qū)是一個(gè)稱為棧棧的區(qū)域的區(qū)域aC C語言還允許建立內(nèi)存動(dòng)態(tài)分配區(qū)域,以存放一些臨時(shí)用語言還允許建立內(nèi)存動(dòng)態(tài)分配區(qū)域,以存放一些臨時(shí)用的數(shù)據(jù),這些數(shù)據(jù)需要時(shí)隨時(shí)開辟,不需要時(shí)隨時(shí)釋放的數(shù)據(jù),這些數(shù)據(jù)需要時(shí)隨時(shí)開辟,不需要時(shí)隨時(shí)釋放。這些數(shù)據(jù)是臨時(shí)存放在一個(gè)特別的自由存儲(chǔ)區(qū),稱為。這些數(shù)據(jù)是臨時(shí)存放在一個(gè)特別的自由存儲(chǔ)區(qū),稱為堆堆區(qū)區(qū)a對(duì)內(nèi)存的動(dòng)態(tài)分配是通過系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)的
56、,對(duì)內(nèi)存的動(dòng)態(tài)分配是通過系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)的,主要有主要有mallocmalloc,calloccalloc,freefree,reallocrealloc這這4 4個(gè)個(gè)函數(shù)函數(shù)a以上以上4 4個(gè)函數(shù)的聲明在個(gè)函數(shù)的聲明在stdlib.hstdlib.h頭文件中,在用到這些函數(shù)頭文件中,在用到這些函數(shù)時(shí)應(yīng)當(dāng)用時(shí)應(yīng)當(dāng)用“#include #include ”指令把指令把stdlib.hstdlib.h頭文件包含頭文件包含到程序文件中到程序文件中。malloc函數(shù)函數(shù)F其函數(shù)原型為其函數(shù)原型為 void void * *mallocmalloc(unsigned (unsigned intin
57、t size); size); a其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為sizesize的連的連續(xù)空間續(xù)空間a函數(shù)的值函數(shù)的值( (也就是函數(shù)的返回值也就是函數(shù)的返回值) )是所分配區(qū)域的第一個(gè)是所分配區(qū)域的第一個(gè)字節(jié)的地址,或者說,此函數(shù)是一個(gè)指針型函數(shù),返回字節(jié)的地址,或者說,此函數(shù)是一個(gè)指針型函數(shù),返回的指針指向該分配域的開頭位置的指針指向該分配域的開頭位置 mallocmalloc(100);(100);a開辟開辟100100字節(jié)的臨時(shí)分配域,函數(shù)值為其第字節(jié)的臨時(shí)分配域,函數(shù)值為其第1 1個(gè)字節(jié)的地個(gè)字節(jié)的地址址 F注意指針的基類型為注意
58、指針的基類型為voidvoid,即不指向任何類型的數(shù),即不指向任何類型的數(shù)據(jù),只提供一個(gè)地址據(jù),只提供一個(gè)地址F如果此函數(shù)未能成功地執(zhí)行(例如內(nèi)存空間不足)如果此函數(shù)未能成功地執(zhí)行(例如內(nèi)存空間不足),則返回空指針,則返回空指針(NULL)(NULL)2 2calloc函數(shù)函數(shù)F其函數(shù)原型為其函數(shù)原型為 void void * *calloccalloc(unsigned n, unsigned size); (unsigned n, unsigned size); F其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n n個(gè)長(zhǎng)度為個(gè)長(zhǎng)度為sizesize的連續(xù)空間,這個(gè)空間一般
59、比較大,足以保存一個(gè)的連續(xù)空間,這個(gè)空間一般比較大,足以保存一個(gè)數(shù)組。數(shù)組。F用用calloccalloc函數(shù)可以為一維數(shù)組開辟動(dòng)態(tài)存儲(chǔ)空間,函數(shù)可以為一維數(shù)組開辟動(dòng)態(tài)存儲(chǔ)空間,n n為為數(shù)組元素個(gè)數(shù),每個(gè)元素長(zhǎng)度為數(shù)組元素個(gè)數(shù),每個(gè)元素長(zhǎng)度為sizesize。這就是動(dòng)態(tài)數(shù)組。這就是動(dòng)態(tài)數(shù)組。函數(shù)返回指向所分配域的起始位置的指針;如果分。函數(shù)返回指向所分配域的起始位置的指針;如果分配不成功,返回配不成功,返回NULLNULL。如:。如:a p p=(=(intint * *) )calloccalloc(50,4(50,4); );a開辟開辟50504 4個(gè)字節(jié)的臨時(shí)分配域,把起始地址賦給指針
60、變量個(gè)字節(jié)的臨時(shí)分配域,把起始地址賦給指針變量p p F等價(jià)于:等價(jià)于:a p p = = ( (intint* *) )mallocmalloc(50(50* *4 4); ); F例如:分配包含例如:分配包含2020個(gè)元素的整型數(shù)組個(gè)元素的整型數(shù)組:a p = p = ( (intint* *) )calloccalloc(20(20, , sizeofsizeof( (intint););a p = p = ( (intint* *) )mallocmalloc(20(20* *sizeofsizeof( (intint););Fsizeofsizeof() ()運(yùn)算符運(yùn)算符a計(jì)算數(shù)據(jù)類型在內(nèi)存在占有的字節(jié)數(shù)計(jì)算數(shù)據(jù)類型在內(nèi)存在占有的字節(jié)數(shù)a例如:例如:sizeofsizeof(char) : 1byte(char) : 1bytesizeofsizeof( (intint) : 2 or 4bytes) : 2 or 4bytessizeofsizeof(double): 8bytes(double): 8bytesa使用使用sizeofsizeof運(yùn)算符可以提高程序的移植性。運(yùn)算符可以提高程序的移植性。a在動(dòng)態(tài)內(nèi)存分配中,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度總經(jīng)理職位聘請(qǐng)與保密協(xié)議合同
- 2025版美容機(jī)構(gòu)美容師專業(yè)聘用及培訓(xùn)合同范本3篇
- 課題申報(bào)參考:南宋私家本朝史籍修撰及其家國(guó)書寫研究
- 課題申報(bào)參考:民國(guó)時(shí)期六大疫災(zāi)的時(shí)空變遷規(guī)律、環(huán)境機(jī)理與社會(huì)影響對(duì)比研究
- 二零二五年度智慧城市規(guī)劃設(shè)計(jì)咨詢服務(wù)合同2篇
- 二零二五年度內(nèi)衣品牌授權(quán)銷售區(qū)域保護(hù)合同規(guī)范
- 2025版模板智慧農(nóng)業(yè)解決方案合同2篇
- 2025年度衛(wèi)星通信設(shè)備銷售與維護(hù)合同4篇
- 2025年度智能零售店鋪門面租賃與系統(tǒng)支持合同
- 2025年度個(gè)人買賣房屋貸款合同規(guī)范2篇
- 采購支出管理制度
- 兒科護(hù)理安全警示教育課件
- 三年級(jí)下冊(cè)口算天天100題
- 國(guó)家中英文名稱及代碼縮寫(三位)
- 人員密集場(chǎng)所消防安全培訓(xùn)
- 液晶高壓芯片去保護(hù)方法
- 使用AVF血液透析患者的護(hù)理查房
- 拜太歲科儀文檔
- 2021年高考山東卷化學(xué)試題(含答案解析)
- 2020新譯林版高中英語選擇性必修一重點(diǎn)短語歸納小結(jié)
- GB/T 19668.7-2022信息技術(shù)服務(wù)監(jiān)理第7部分:監(jiān)理工作量度量要求
評(píng)論
0/150
提交評(píng)論