版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、高級語言程序設(shè)計(jì),第7章 內(nèi)存單元的地址 指針程序設(shè)計(jì)(3),問題3 把學(xué)生信息按學(xué)號或姓名排序 (指針版),問題描述:設(shè)有批量的學(xué)生信息,包括學(xué)號num,姓名name,成績grade,請把它們保存到內(nèi)存中,并按學(xué)號或姓名進(jìn)行排序。,分析,學(xué)號和姓名均為字符串,如果用數(shù)組存放,學(xué)號信息比較規(guī)則,假如是10個(gè)字符組成,只需定義數(shù)組 char num 11,但是對于姓名來說,長短不一,必須開辟比較寬的數(shù)組,如char name 20, 這樣就造成了不必要的浪費(fèi)。 C語言允許直接用字符型指針指向一個(gè)字符串,稱為指針型字符串,因此多個(gè)同學(xué)的信息可以定義一個(gè)字符型指針數(shù)組,我們必須回答下面這些問題,如何
2、定義指針型字符串 如何給指針型字符串提供數(shù)據(jù)(賦值或輸入)(回顧:數(shù)組型字符串怎么賦值怎么輸入?) 如何定義字符型指針數(shù)組,指針型字符串的定義,const char *namePtr=“zhangqiang”; 注意namePtr指向的是常量字符串 namePtr稱為指針型字符串或者說指向字符串的指針 比較namePtr與 char nameStr=“zhangqiang”; 有什么不同,1)namePtr是一個(gè)指針變量,可以指向不同的字符串,但nameStr一旦定義就不可以改變,是常量 2)指針變量namePtr在定義之后可以通過賦值語句重新獲得一個(gè)字符串的首地址 namePtr = “l(fā)i
3、ping”;(正確) 但nameStr = “l(fā)iping”;(錯(cuò)誤),3) 數(shù)組型字符串通過鍵盤輸入一個(gè) scanf(“%s”,nameStr); 但是指針型,如果沒有為namePtr申請空間 scanf(“%s”,namePtr); 或gets (namePtr); 都是錯(cuò)誤的,,當(dāng)然可以用字符型指針指向一個(gè)字符型數(shù)組 如 char str20,*ptr; ptr = str; 再scanf(“%s”,ptr);,4)沒有初始化的指針ptr,直接作為字符串使用是錯(cuò)誤的: char *ptr; ptr0 = a; ptr1 = b; ptr2 = c; ptr3 = 0; 是錯(cuò)誤的,例1 字
4、符串長度計(jì)算函數(shù),int myStrlen(const char *pStr) /實(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ù)組,字符串指針放在一起就構(gòu)成了一個(gè)指針數(shù)組 const char *nam
5、e10 = ZhangQiang,LiHong, WangLi,ZhaoMing,QianJin, SunYang,XuLei,BaoFang, GuoLiang,XiaoXiong“ ;,思考題:,如果用基于指針的字符串構(gòu)成的指針數(shù)組對字符串排序,可否不交換字符串的內(nèi)容而只修改指向它的指針?,如何從鍵盤輸入字符串給字符型指針?,在程序中可以直接賦值給指針 不能直接從鍵盤輸入字符串給指針 可以先輸入給一個(gè)字符型數(shù)組 再copy給指針?biāo)赶虻目臻g,這個(gè)指針指向的空間必需事先申請好。如果字符串的長短事先不能確定空間該怎么申請?,動(dòng)態(tài)申請內(nèi)存空間,在函數(shù)內(nèi)部的自動(dòng)變量,在函數(shù)調(diào)用時(shí)自動(dòng)分配內(nèi)存,函數(shù)
6、調(diào)用結(jié)束后自動(dòng)撤銷; 全局外部變量或靜態(tài)局部/外部變量在編譯時(shí)靜態(tài)分配內(nèi)存。 字符串長短不能確定就要?jiǎng)討B(tài)分配內(nèi)存,操作系統(tǒng)加載的應(yīng)用程序之后,將形成一個(gè)專門服務(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語言stdlib.h庫接口的一部分或者用malloc.h包括: malloc、calloc、realloc和free malloc函數(shù):分配長度為size的連續(xù)內(nèi)存空間,其原型為 void *malloc(unsigned int size);,(2)free函數(shù):釋放動(dòng)態(tài)申請的空間,其原型為 f
7、ree(void *p); 動(dòng)態(tài)申請的空間用畢之后必須調(diào)用free函數(shù)把它釋放,供系統(tǒng)重新分配。,(3)calloc函數(shù):為同類型數(shù)據(jù)分配連續(xù)的內(nèi)存空間,其原型為: void *calloc(unsigned int num, unsigned int size); 其中num是要申請的內(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;
8、int *aPtr = /錯(cuò)誤的間接引用,只有非void*類型的指針才可以使用間接引用運(yùn)算*。 void*類型的指針只能起到保存指針的作用。,malloc舉例,char *cPtr; cPtr =(char*) malloc(10); scanf(“%s”,cPtr); printf(%sn,cPtr); free(cPtr);,注意!,char *cPtr; cPtr=“hello”; /這時(shí)cPtr指向了靜態(tài)的“hello” cPtr指向的空間由“hello”確定 不能再用scanf(“%s”,cPtr);,通常的做法,char nameStr20, *namePtr; 先讀到字符型數(shù)組中
9、,計(jì)算字符串的大小 scanf(%s,nameStr); int len=strlen(nameStr); 再申請相應(yīng)的空間 namePtr = (char *) malloc(len*sizeof(char); 然后再拷貝 strcpy( namePtr, nameStr); 或 namePtr=nameStr; 這樣 namePtr就指向了nameStr,看一個(gè)例子,#include #include #include /#include int main(void) const char *namePtr=zhangqiang; puts(namePtr); namePtr=lksdjf
10、klsdj; puts(namePtr); /gets(namePtr); /err char nameStr120,nameStr=zhangqiang; char *p = nameStr1,*p2=nameStr; puts(nameStr); gets(p); puts(p); /nameStr=lksdjfkld; strcpy(p,p2); puts(nameStr); gets(nameStr); puts(nameStr); char *namePtr2; namePtr2 = (char *) malloc(strlen(nameStr)*sizeof(char); /str
11、cpy(namePtr2,nameStr); namePtr2=nameStr; puts(namePtr2); return 0; ,同樣還可以,動(dòng)態(tài)申請一維整型數(shù)據(jù)空間,7.5.3動(dòng)態(tài)申請一維數(shù)組,動(dòng)態(tài)申請二維整型數(shù)據(jù)空間,用一個(gè)列指針指向它。,7.5.4動(dòng)態(tài)申請二維數(shù)組,同理還可動(dòng)態(tài)申請行指針的二維數(shù)組 略,大家自己研究一下,查查相關(guān)資料,讓指針指向在函數(shù)中動(dòng)態(tài)申請的內(nèi)存,在后續(xù)數(shù)據(jù)結(jié)構(gòu)與算法的課程中常常有這樣的需求,即在主調(diào)函數(shù)中定義一個(gè)指針變量,但不知道它該指向哪里,還不知道它指向的內(nèi)存空間,而是由另一個(gè)專門的函數(shù)動(dòng)態(tài)申請所需的空間,這樣的函數(shù)該如何實(shí)現(xiàn)呢?讓我們看看下面的這個(gè)函數(shù)是
12、否可以達(dá)到我們的要求,,返回動(dòng)態(tài)申請的指針,int* funcReturnPtr(void) int *tmp; tmp=(int*)malloc(sizeof(int); return tmp; /該指針指向的空間函數(shù)調(diào)用結(jié)束時(shí)沒有自動(dòng)釋放 /在主函數(shù)或其它地方中使用它不會出現(xiàn)非法訪問 在主函數(shù)中定義 int *aptr = NULL; /注意aPtr沒有指向任何地方 函數(shù)調(diào)用 aptr= func(); 之后,aptr便指向了堆中申請的空間,,但是,這種方法明顯有局限性,如果有多個(gè)動(dòng)態(tài)指針需要返回就不能這樣做了。,void func(int *ptr) ptr=(int *)malloc(
13、sizeof(int); 設(shè)在主函數(shù)中有 int *aptr = NULL; /注意aPtr沒有指向任何地方 函數(shù)調(diào)用 func(aptr); 能否使aptr指向在函數(shù)func中申請的內(nèi)存空間呢?,使用二級指針參數(shù)返回動(dòng)態(tài)申請的指針,例,注意:,*aptr=(int *)malloc(sizeof(int); 這里是把申請到的指針賦值給二級指針aptr所指向的一級指針變量即實(shí)參的aptr,現(xiàn)在可以完整的實(shí)現(xiàn)開始給出的問題了,動(dòng)態(tài)申請空間,輸入原始數(shù)據(jù) input 按學(xué)號或姓名字符串排序sort 輸出排序結(jié)果 print 代碼略,再介紹兩個(gè)特別的問題,命令行參數(shù) C+的引用,命令行參數(shù),每個(gè)應(yīng)用
14、程序都是一個(gè)可執(zhí)行程序,都是可以看成在操作系統(tǒng)中運(yùn)行的命令。 到現(xiàn)在為止我們設(shè)計(jì)的main函數(shù)都是只有void參數(shù),實(shí)際上main函數(shù)也允許有參數(shù),但是它的參數(shù)個(gè)數(shù)和類型是不能隨便定義的。,大家知道下面的命令,gcc -o test test.cpp 它有幾個(gè)參數(shù)呢? 又如 dir /p /w DOS命令后面的選項(xiàng)用/表示,/p就是分頁顯示文件目錄,/w是按多列像窗口一樣顯示文件目錄。 copy test.cpp testbak.cpp,那么main函數(shù)的參數(shù)是什么樣子的呢?,main函數(shù)的參數(shù)只有兩個(gè) 第一個(gè)形參是整型的簡單變量,其名字規(guī)定為argc(arg是參數(shù)argment的縮寫,c是c
15、ount的意思), 第二個(gè)形參就是我們剛剛學(xué)過的字符型指針數(shù)組,其名字規(guī)定為argv(v是向量vector的意思,argv就是所有的參數(shù)構(gòu)成一列,含應(yīng)用程序名字)。,有參數(shù)的main函數(shù)的具體形式如下: int main(int argc, char *argv) 這兩個(gè)參數(shù)的具體含義是什么呢?先來看看怎么樣調(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+中的引用,二級指針的方法實(shí)現(xiàn)上一小節(jié)的需求比較容易出錯(cuò),不易理解。 C+編譯器提供了一種引
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年房地產(chǎn)投資的法律規(guī)定與合規(guī)體系
- 2025年衛(wèi)生院崗前人事考試試題及答案
- 2025年傳感器筆試題目及答案
- 2025年陜西年底人事考試及答案
- 2025年永定縣教師編制筆試及答案
- 2026年工程結(jié)構(gòu)非線性分析的案例分析
- 2025年北師大文字學(xué)博筆試及答案
- 2025年張家港醫(yī)生事業(yè)編考試及答案
- 2026年清明節(jié)的春游活動(dòng)
- 2025年安徽皖維集團(tuán)招聘筆試及答案
- 2026年中考英語復(fù)習(xí)專題課件:謂語動(dòng)詞的時(shí)態(tài)和被動(dòng)語態(tài)
- 糧食行業(yè)競爭對手分析報(bào)告
- 兒科MDT臨床技能情景模擬培訓(xùn)體系
- 【高三上】2026屆12月八省聯(lián)考(T8聯(lián)考)語文試題含答案
- (人教版)必修第一冊高一物理上學(xué)期期末復(fù)習(xí)訓(xùn)練 專題02 連接體、傳送帶、板塊問題(原卷版)
- 護(hù)理不良事件根本原因分析
- 社會心理學(xué)考試題及答案
- 門窗工程掛靠協(xié)議書
- 醫(yī)療器械經(jīng)營企業(yè)質(zhì)量管理體系文件(2025版)(全套)
- 出鐵廠鐵溝澆注施工方案
- 2025年中小學(xué)教師正高級職稱評聘答辯試題(附答案)
評論
0/150
提交評論