7內(nèi)存單元的地址-指針程序設(shè)計(jì)3.ppt_第1頁(yè)
7內(nèi)存單元的地址-指針程序設(shè)計(jì)3.ppt_第2頁(yè)
7內(nèi)存單元的地址-指針程序設(shè)計(jì)3.ppt_第3頁(yè)
7內(nèi)存單元的地址-指針程序設(shè)計(jì)3.ppt_第4頁(yè)
7內(nèi)存單元的地址-指針程序設(shè)計(jì)3.ppt_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、高級(jí)語(yǔ)言程序設(shè)計(jì),第7章 內(nèi)存單元的地址 指針程序設(shè)計(jì)(3),問(wèn)題3 把學(xué)生信息按學(xué)號(hào)或姓名排序 (指針版),問(wèn)題描述:設(shè)有批量的學(xué)生信息,包括學(xué)號(hào)num,姓名name,成績(jī)grade,請(qǐng)把它們保存到內(nèi)存中,并按學(xué)號(hào)或姓名進(jìn)行排序。,分析,學(xué)號(hào)和姓名均為字符串,如果用數(shù)組存放,學(xué)號(hào)信息比較規(guī)則,假如是10個(gè)字符組成,只需定義數(shù)組 char num 11,但是對(duì)于姓名來(lái)說(shuō),長(zhǎng)短不一,必須開(kāi)辟比較寬的數(shù)組,如char name 20, 這樣就造成了不必要的浪費(fèi)。 C語(yǔ)言允許直接用字符型指針指向一個(gè)字符串,稱為指針型字符串,因此多個(gè)同學(xué)的信息可以定義一個(gè)字符型指針數(shù)組,我們必須回答下面這些問(wèn)題,如何

2、定義指針型字符串 如何給指針型字符串提供數(shù)據(jù)(賦值或輸入)(比較數(shù)組型字符串怎么賦值怎么輸入?) 如何定義字符型指針數(shù)組,指針型字符串的定義,char *namePtr=“zhangqiang”; namePtr稱為指針型字符串或者說(shuō)指向字符串的指針 下面比較namePtr與 char nameStr=“zhangqiang”; 有什么不同,1). namePtr是一個(gè)指針變量,可以指向不同的字符串,nameStr一旦定義就不可以改變 2)指針變量namePtr在定義之后可以通過(guò)賦值語(yǔ)句重新獲得一個(gè)字符串的首地址 namePtr = “l(fā)iping”;(正確) nameStr = “l(fā)ipin

3、g”;(錯(cuò)誤),3) 數(shù)組型字符串通過(guò)鍵盤(pán)輸入一個(gè) scanf(“%s”,nameStr); 但是指針型,如果沒(méi)有為namePtr申請(qǐng)空間 scanf(“%s”,namePtr); 或gets (namePtr); 都是錯(cuò)誤的,,當(dāng)然可以字符型指針指向一個(gè)字符型數(shù)組 如 char str20,*ptr; ptr = str; scanf(“%s”,ptr);,4)沒(méi)有初始化的指針ptr,直接作為字符串使用是錯(cuò)誤的: char *ptr; ptr0 = a; ptr1 = b; ptr2 = c; ptr3 = 0;,例1如字符串長(zhǎng)度計(jì)算函數(shù),int myStrlen(const char *p

4、Str) /實(shí)參可以是一個(gè)數(shù)組名 int len=0; for( ; *pStr!= 0; pStr+) len+; return(len); ,例2 字符串拷貝函數(shù),void myStrcpy( char *dstStr, const char *srcStr) while(*srcStr!=0) *dstStr+ = *srcStr+; /*dstStr = *srcStr /srcStr+; /dstStr+; *dstStr=0; ,字符指針數(shù)組,字符串指針?lè)旁谝黄鹁蜆?gòu)成了一個(gè)指針數(shù)組 const char *name10 = ZhangQiang,LiHong, WangLi,Zha

5、oMing,QianJin, SunYang,XuLei,BaoFang, GuoLiang,XiaoXiong“ ;,思考題:,如果用基于指針的字符串構(gòu)成的指針數(shù)組對(duì)字符串排序,可否不交換字符串的內(nèi)容而只修改指向它的指針?,如何從鍵盤(pán)輸入字符串給字符型指針?,在程序中可以直接賦值給指針 不能直接從鍵盤(pán)輸入字符串給指針 可以先輸入給一個(gè)字符型數(shù)組 再copy給指針?biāo)赶虻目臻g,這個(gè)指針指向的空間必需事先申請(qǐng)好。如果字符串的長(zhǎng)短事先不能確定空間該怎么申請(qǐng)?,動(dòng)態(tài)申請(qǐng)內(nèi)存空間,在函數(shù)內(nèi)部的自動(dòng)變量,在函數(shù)調(diào)用時(shí)自動(dòng)分配內(nèi)存,函數(shù)調(diào)用結(jié)束后自動(dòng)撤銷; 全局外部變量或靜態(tài)局部/外部變量在編譯時(shí)靜態(tài)分配

6、內(nèi)存。 字符串長(zhǎng)短不能確定就要?jiǎng)討B(tài)分配內(nèi)存,操作系統(tǒng)加載的應(yīng)用程序之后,將形成一個(gè)專門(mén)服務(wù)于該應(yīng)用程序的內(nèi)存空間(也叫進(jìn)程空間) 自動(dòng)分配的內(nèi)存分配在棧區(qū),靜態(tài)分配的內(nèi)存位于全局?jǐn)?shù)據(jù)區(qū),動(dòng)態(tài)分配的內(nèi)存位于堆區(qū)。,動(dòng)態(tài)分配內(nèi)存函數(shù),C語(yǔ)言stdlib.h庫(kù)接口的一部分,包括malloc、calloc、realloc和free malloc函數(shù):分配長(zhǎng)度為size的連續(xù)內(nèi)存空間,其原型為 void *malloc(unsigned int size);,(2)free函數(shù):釋放動(dòng)態(tài)申請(qǐng)的空間,其原型為 free(void *p); 動(dòng)態(tài)申請(qǐng)的空間用畢之后必須調(diào)用free函數(shù)把它釋放,供系統(tǒng)重新分配

7、。,(3)calloc函數(shù):為同類型數(shù)據(jù)分配連續(xù)的內(nèi)存空間,其原型為: void *calloc(unsigned int num, unsigned int size); 其中num是要申請(qǐng)的內(nèi)存空間的數(shù)量,size是每個(gè)空間的字節(jié)數(shù)。,(4) realloc函數(shù):改變已經(jīng)分配的空間的大小,其原型為 void * realloc(void *p, unsigned int size); 把p所指向的空間大小改為size。,void* 類型的指針,int a = 10; float x = 5.3; int *aPtr = /錯(cuò)誤的間接引用,只有非void*類型的指針才可以使用間接引用運(yùn)算*。

8、 void*類型的指針只能起到保存指針的作用。,malloc舉例,char *cPtr; cPtr =(char*) malloc(10); cPtr=hello; scanf(“%s”,cPtr); printf(%sn,cPtr); free(cPtr);,char nameStr20, *namePtr; scanf(%s,nameStr); int len=strlen(nameStr); namePtr = (char *) malloc(len*sizeof(char); strcpy( namePtr, nameStr); namePtr指向了nameStr,同樣還可以,動(dòng)態(tài)申請(qǐng)

9、一維整型空間,7.5.3動(dòng)態(tài)申請(qǐng)一維數(shù)組,動(dòng)態(tài)申請(qǐng)二維整型空間,用一個(gè)列指針指向它。,7.5.4動(dòng)態(tài)申請(qǐng)二維數(shù)組,同理還可動(dòng)態(tài)申請(qǐng)行指針的二維數(shù)組,看看簡(jiǎn)單的代碼 charPtr2.c 不能實(shí)現(xiàn)我們的想法,讓指針指向在函數(shù)中動(dòng)態(tài)申請(qǐng)的內(nèi)存,在后續(xù)數(shù)據(jù)結(jié)構(gòu)與算法的課程中常常有這樣的需求,即在主調(diào)函數(shù)中定義一個(gè)指針變量,但不知道它該指向哪里,還不知道它指向的內(nèi)存空間,而是由另一個(gè)專門(mén)的函數(shù)動(dòng)態(tài)申請(qǐng)所需的空間,這樣的函數(shù)該如何實(shí)現(xiàn)呢?讓我們看看下面的這個(gè)函數(shù)是否可以達(dá)到我們的要求,,void func(int *ptr) ptr=(int *)malloc(sizeof(int); 設(shè)在主函數(shù)中有

10、int *aptr = NULL; /注意aPtr沒(méi)有指向任何地方 函數(shù)調(diào)用 func(aptr); 能否使aptr指向在函數(shù)func中申請(qǐng)的內(nèi)存空間呢?,返回動(dòng)態(tài)申請(qǐng)的指針,int* funcReturnPtr(void) int *tmp; tmp=(int*)malloc(sizeof(int); return tmp; /該指針指向的空間函數(shù)調(diào)用結(jié)束時(shí)沒(méi)有自動(dòng)釋放 /在主函數(shù)或其它地方中使用它不會(huì)出現(xiàn)非法訪問(wèn) 在主函數(shù)中定義 int *aptr = NULL; /注意aPtr沒(méi)有指向任何地方 函數(shù)調(diào)用 aptr= func(); 之后,aptr便指向了堆中申請(qǐng)的空間,,但是,這種方法明

11、顯有局限性,如果有多個(gè)動(dòng)態(tài)指針需要返回就不能這樣做了。因此標(biāo)準(zhǔn)的做法是使用二級(jí)指針間作為函數(shù)的參數(shù),使用二級(jí)指針參數(shù)返回動(dòng)態(tài)申請(qǐng)的指針,*aptr=(int *)malloc(sizeof(int);,現(xiàn)在可以完整的實(shí)現(xiàn)開(kāi)始給出的問(wèn)題了,輸入原始數(shù)據(jù) input 動(dòng)態(tài)申請(qǐng)空間 按學(xué)號(hào)或姓名字符串排序sort 輸出 print 代碼略,命令行參數(shù),每個(gè)應(yīng)用程序都是一個(gè)可執(zhí)行程序,都是可以看成在操作系統(tǒng)中運(yùn)行的命令。 到現(xiàn)在為止我們?cè)O(shè)計(jì)的main函數(shù)都是只有void參數(shù),實(shí)際上main函數(shù)也允許有參數(shù),但是它的參數(shù)個(gè)數(shù)和類型是不能隨便定義的。,再介紹兩個(gè)特別的問(wèn)題,命令行參數(shù) C+的引用,大家知道

12、下面的命令,gcc -o test test.cpp 它有幾個(gè)參數(shù)呢? 又如 dir /p /w DOS命令后面的選項(xiàng)用/表示,/p就是分頁(yè)顯示文件目錄,/w是按多列像窗口一樣顯示文件目錄。 copy test.cpp testbak.cpp,那么main函數(shù)的參數(shù)是什么樣子的呢?,main函數(shù)的參數(shù)只有兩個(gè) 第一個(gè)形參是整型的簡(jiǎn)單變量,其名字規(guī)定為argc(arg是參數(shù)argment的縮寫(xiě),c是count的意思), 第二個(gè)形參就是我們剛剛學(xué)過(guò)的字符型指針數(shù)組,其名字規(guī)定為argv(v是向量vector的意思,argv就是所有的參數(shù)構(gòu)成一列,含應(yīng)用程序名字)。,有參數(shù)的main函數(shù)的具體形式如下: int main(int argc, char *argv) 這兩個(gè)參數(shù)的具體含義是什么呢?先來(lái)看看怎么樣調(diào)用main函數(shù),怎么給實(shí)參的。 應(yīng)用程序名 參數(shù)1 參數(shù)2 參數(shù)3 等等 命令行參數(shù)。 應(yīng)用程序名,參數(shù)1,參數(shù)2,參數(shù)3, 構(gòu)成了第二個(gè)實(shí)參傳給argv,即字符型指針數(shù)組, 命令行中字符串個(gè)數(shù)就是第一個(gè)實(shí)參傳給argc,C+中的引用,二級(jí)指針的方法實(shí)現(xiàn)上一小節(jié)的需求比較容易出錯(cuò),不易理解。 C+編譯器提供了一種引用傳遞方式。什么是引用(Reference)?

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論