《指針指針數(shù)組、多級(jí)指針、動(dòng)態(tài)指針.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《指針指針數(shù)組、多級(jí)指針、動(dòng)態(tài)指針.ppt(23頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、1,數(shù)組指針以此類推,一維數(shù)組名是“列指針類型”----“元素指針類型” 指針變量的定義:int *p; 二維數(shù)組名是“行指針類型” 指針變量的定義:int (*p)4 ; 三維數(shù)組名是“頁指針類型” 指針變量的定義:int (*p)34 ; 四維數(shù)組名是“塊指針類型” 指針變量的定義:int (*p)345 ;,圓括號(hào)是必須的,2,問題的提出,變量是用于存放單個(gè)數(shù)據(jù)的 數(shù)組是用于存放“同類型”的多個(gè)數(shù)據(jù)的 方便循環(huán)控制結(jié)構(gòu)的編程 指針變量是用于存放單個(gè)地址號(hào)的 “同類型”的多個(gè)地址號(hào)是否能夠集中存儲(chǔ)在一起構(gòu)成“指針數(shù)組”呢?,3,元素均為指針類型數(shù)據(jù)的數(shù)組,稱為指針數(shù)組 定義形式為: 類型關(guān)
2、鍵字 *數(shù)組名數(shù)組長(zhǎng)度; 例如 char *pStr5;,四、指針數(shù)組,注意 沒有 圓括號(hào),4,例: 二維字符數(shù)組,void main() int i; char str10 = Pascal,Basic,Fortran, Java,Visual C; for (i=0; i<5; i++) printf(%sn, stri); ,str,,str0,Pascal,str1,str2,str3,Basic,Fortran,Java,,,,,二維數(shù)組,Visual C,str4,,5,例:字符指針數(shù)組,void main() int i; char *ptr =
3、 Pascal,Basic,Fortran, Java,Visual C; for (i=0; i<5; i++) printf(%sn, ptri); ,6,例:字符串按字典順序排序二維數(shù)組編程,char strN10 = Pascal,Basic,Fortran, Java,Visual C; for (i=0; i
4、,temp); ,str,str,str,str,str,7,例:字符串按字典順序排序指針數(shù)組編程,char *ptrN = Pascal,Basic,Fortran, Java,Visual C; for (i=0; i
5、 argc, char* argv) 當(dāng)你把main函數(shù)寫成這樣時(shí) argc的值為程序執(zhí)行時(shí)參數(shù)的數(shù)目(包括命令本身) argvi為指向第i個(gè)參數(shù)的字符指針 這兩個(gè)內(nèi)設(shè)形參用于接收命令行參數(shù),通過命令行參數(shù),使用戶可以根據(jù)需要來決定我們的程序 干什么、怎么干,9,例:演示命令行參數(shù)與main函數(shù)各形參之間的關(guān)系,void main(int argc, char *argv) int i; printf(The program name is:%sn, argv0); if (argc 1) printf(The other arguments are following:n); for (i
6、= 1; i
7、:指針變量中存放目標(biāo)變量的地址,例 int **p1; int *p2; int i=3; p2=,二級(jí)指針:指針變量中存放一級(jí)指針變量的地址,例 int *p; int i=3; p=,一級(jí)指針,二級(jí)指針,一級(jí)指針,目標(biāo)變量,13,(1) 定義形式:數(shù)據(jù)類型 **指針名; 如 int *p, i=5,**pp; (2) 賦值 p= (3)引用方法 pp的值 *pp的值 **pp的值,多級(jí)指針定義形式,14,動(dòng)態(tài)分配內(nèi)存,,15,2.動(dòng)態(tài)指針 為什么要?jiǎng)討B(tài)分配內(nèi)存? 當(dāng)事先不知道所需要處理的數(shù)據(jù)有多大時(shí), 使用靜態(tài)數(shù)組, 若數(shù)組開辟得太大, 則浪費(fèi)內(nèi)存資源(甚至可能不成功); 若
8、開辟得太小, 又不能滿足計(jì)算需要。采用動(dòng)態(tài)分配內(nèi)存的方法,使用完畢,再釋放內(nèi)存,以備其它程序使用。 C語言中提供了幾個(gè)標(biāo)準(zhǔn)函數(shù),以實(shí)現(xiàn)內(nèi)存的分配和釋放。,16,動(dòng)態(tài)分配內(nèi)存,#include #include void* malloc(unsigned int size); 向系統(tǒng)申請(qǐng)大小為size的內(nèi)存塊,把首地址返回。如果申請(qǐng)不成功,返回NULL void* calloc(unsigned int num, unsigned int size); 向系統(tǒng)申請(qǐng)num個(gè)size大小的內(nèi)存塊,把首地址返回。如果申請(qǐng)不成功,返回NULL void free(void* p); 釋放由ma
9、lloc()和calloc()申請(qǐng)的內(nèi)存塊。p是指向此塊的指針 void*類型的指針可以指向任意類型的變量,17,動(dòng)態(tài)數(shù)組,一維動(dòng)態(tài)數(shù)組 int *p = NULL; printf(Please enter array size:); scanf(%d, //像使用一維數(shù)組一樣使用 ,18,函數(shù)指針(選學(xué)),1.函數(shù)指針的概念 一個(gè)函數(shù)在編譯時(shí),被分配了一個(gè)入口地址,這個(gè)地址就稱為該函數(shù)的指針。 可以用一個(gè)指針變量指向一個(gè)函數(shù),然后通過該指針變量調(diào)用此函數(shù),19,2.指向函數(shù)的指針變量 (1)定義格式 函數(shù)類型 (*指針變量)( ); 注意:“*指針變量”外的括號(hào)不能缺,否則成了返回指針
10、值的函數(shù)。 例如,int (*fp)( ); /* fp為指向int函數(shù)的指針變量*/ (2)賦值 函數(shù)名代表該函數(shù)的入口地址。因此,可用函數(shù) 名給指向函數(shù)的指針變量賦值。 指向函數(shù)的指針變量 注意:函數(shù)名后不能帶括號(hào)和參數(shù);函數(shù)名前的“ for ( i=0;i
11、除的 */,int main() int a9=1,2,3,4,5,6,7,8,9; int x; int (*fun)(int,int); fun=xiaoyu; x=Locate(a,9,6,fun); printf(Locate:%dn,x); return 1; ,23,指針的概念 指針是一種特殊的數(shù)據(jù)類型 指針的使用原則 永遠(yuǎn)要清楚指針變量存放的是什么,指向了什么 指針與數(shù)組之間的關(guān)系 理解一維數(shù)組與指針是理解二維數(shù)組與指針的基礎(chǔ) 掌握二維數(shù)組在內(nèi)存中的存放方式,是理解二維數(shù)組的行指針和列指針的關(guān)鍵 指針數(shù)組 指針函數(shù) 指針的應(yīng)用 做函數(shù)參數(shù),傳地址調(diào)用 動(dòng)態(tài)分配內(nèi)存,實(shí)現(xiàn)動(dòng)態(tài)數(shù)組,對(duì)于動(dòng)態(tài)分配的內(nèi)存,不要忘記在不使用時(shí)釋放,請(qǐng)自己總結(jié)這章所學(xué)內(nèi)容,