第八章處理動(dòng)態(tài)數(shù)據(jù)_第1頁
第八章處理動(dòng)態(tài)數(shù)據(jù)_第2頁
第八章處理動(dòng)態(tài)數(shù)據(jù)_第3頁
第八章處理動(dòng)態(tài)數(shù)據(jù)_第4頁
第八章處理動(dòng)態(tài)數(shù)據(jù)_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1頁,共30頁,2023年,2月20日,星期三主要內(nèi)容案例:處理“學(xué)生信息管理系統(tǒng)”的人數(shù)變動(dòng)使用指針處理表示學(xué)生人數(shù)變動(dòng)案例實(shí)施學(xué)生練習(xí)拓展小結(jié)第2頁,共30頁,2023年,2月20日,星期三用數(shù)組來存儲(chǔ)多位學(xué)生的信息。由于在C語言中數(shù)組只能定義定長(zhǎng)的,而在實(shí)際中無法事先知道學(xué)生的人數(shù),從而無法確定數(shù)組的大小。所以當(dāng)學(xué)生人數(shù)變動(dòng)的時(shí)候,使用數(shù)組就有點(diǎn)不方便了:因?yàn)槿绻麑?shù)組定義過長(zhǎng),浪費(fèi)空間;定義太短,又不夠用?,F(xiàn)在在這里引入一個(gè)C語言中重要的概念----指針。通過使用指針,就可以很方便的實(shí)現(xiàn)學(xué)生人數(shù)的變動(dòng),根據(jù)實(shí)際情況來申請(qǐng)存儲(chǔ)空間。從而不會(huì)出現(xiàn)存儲(chǔ)空間的浪費(fèi)或不夠用問題。在本章,將繼續(xù)完善“學(xué)生信息管理系統(tǒng)”案例程序。在上一章案例程序的基礎(chǔ)上,可以實(shí)現(xiàn)對(duì)學(xué)生人數(shù)的變化進(jìn)行存儲(chǔ)空間的動(dòng)態(tài)分配管理。具體是臨時(shí)確定學(xué)生人數(shù),進(jìn)行存儲(chǔ)空間的動(dòng)態(tài)分配處理“學(xué)生信息管理系統(tǒng)”人數(shù)變動(dòng)第3頁,共30頁,2023年,2月20日,星期三如果在程序中定義了一個(gè)變量,在編譯時(shí)就給這個(gè)變量分配內(nèi)存單元。系統(tǒng)根據(jù)程序中定義變量的類型,分配特定長(zhǎng)度的空間。內(nèi)存區(qū)的每一個(gè)字節(jié)都有一個(gè)編號(hào),這就是“地址”。它就相當(dāng)于旅館中的房間號(hào)或是學(xué)生宿舍的宿舍號(hào)一樣。在地址所標(biāo)志的內(nèi)存單元中存放數(shù)據(jù),就相當(dāng)于旅館中各個(gè)房間中住旅客一樣。根據(jù)內(nèi)存編號(hào)也可以準(zhǔn)確地找到所需要的內(nèi)存單元。所以內(nèi)存單元的地址與內(nèi)存單元的內(nèi)容是兩個(gè)不同的概念。

使用指針處理人數(shù)變動(dòng)-指針第4頁,共30頁,2023年,2月20日,星期三使用指針處理人數(shù)變動(dòng)-指針

…...…...20003004x20043000y變量x變量y定義了一個(gè)int型變量x,編譯時(shí)系統(tǒng)分配了2000到2003四個(gè)字節(jié)給變量x。定義了一個(gè)float型變量y,編譯時(shí)分配了3000到3003四個(gè)字節(jié)給變量y。通常我們只關(guān)心變量的第一個(gè)字節(jié)的編號(hào)。將變量的第一個(gè)字節(jié)編號(hào)稱該變量的地址。2000是變量x的地址,3000是變量y的地址。把一個(gè)變量的地址稱為該變量的“指針”。嚴(yán)格地說,一個(gè)指針就是一個(gè)地址。第5頁,共30頁,2023年,2月20日,星期三有了指針的定義,就可以來了解一下變量的值的讀取操作。在程序中一般是通過變量名來對(duì)內(nèi)存單元進(jìn)行存取操作的。如printf(“%d”,x)的執(zhí)行是這樣的:根據(jù)變量名與地址的對(duì)應(yīng)關(guān)系(這個(gè)關(guān)系是在編譯時(shí)確定的),找到變量x的地址2000,然后從由2000開始的四個(gè)字節(jié)中取出數(shù)據(jù),把它輸出。這種按變量地址存取變量值的方式稱“直接訪問”方式另外還可以采用一種稱為“間接訪問”的方式,將變量x的地址存放在另外一個(gè)變量中。C語言中可以定義這樣的一種特殊變量,它存放變量的地址。假設(shè)定義了一個(gè)變量x_pointer,用來存放整型變量x的地址,可以通過下列語句將x變量的地址2000存放到變量x_pointer中:x_pointer=&x;這時(shí),x_pointer中的值就是2000,即變量x所占用單元的起始地址。要變量x的值時(shí),也就可以通過間接方式:先找到存放變量x地址的變量,從中取到x的地址(2000),然后到2000到2003字節(jié)中取出變量x的值。使用指針處理人數(shù)變動(dòng)-指針2000X_pointer:(3012-3015)X_valueX:(2000-2003)X_valueX:(2000-2003)第6頁,共30頁,2023年,2月20日,星期三一個(gè)變量的地址稱為該變量的“指針”。如果用一個(gè)變量專門來存放另外一個(gè)變量的地址(即指針),則它就稱為“指針變量”。也可以說存放變量地址的變量是指針變量。定義一個(gè)指針變量必須包括3個(gè)內(nèi)容:(1)指針類型說明,即定義變量為一個(gè)指針變量;(2)指針變量名;(3)指針變量所指向的變量的數(shù)據(jù)類型。其一般定義形式為:基類型*指針變量名;其中*表示這是一個(gè)指針變量,基類型表示指針變量指向的變量的數(shù)據(jù)類型?;愋捅仨氈付?,一個(gè)指針變量只能指向同一個(gè)類型的變量指針處理人數(shù)變動(dòng)-指針變量的定義int*p1;float*p2;Student*stu;第7頁,共30頁,2023年,2月20日,星期三當(dāng)定義了一個(gè)指針變量之后,和其他變量一樣,就應(yīng)該給它賦值。沒有賦值的指針變量不能使用。指針變量的賦值只能是賦予地址,絕對(duì)不能賦予其他數(shù)據(jù),也就是讓它指向它定義的那個(gè)基類型的一個(gè)變量。指針變量的兩個(gè)運(yùn)算符(1)&:取地址運(yùn)算符,也就是說取變量的地址。(2)*:指針運(yùn)算符,也就是說取指針?biāo)缸兞康膬?nèi)容。如:&a為變量a的地址,*p為指針變量p所指向的存儲(chǔ)單元中的內(nèi)容。&和*互為逆運(yùn)算。對(duì)于運(yùn)算符&和*,這兩個(gè)運(yùn)算符的優(yōu)先級(jí)別相同。如果沒有括號(hào),像&*i_pointer,計(jì)算的時(shí)候是按照自右向左結(jié)合。因此在這里先是計(jì)算*i_pointer,它就是變量i,再執(zhí)行&運(yùn)算,所以&*i_pointer就是i變量的地址。指針處理人數(shù)變動(dòng)-指針操作符第8頁,共30頁,2023年,2月20日,星期三shortinti=10;shortint*i_pointer;i_pointer=&i;這樣定義的指針變量i_pointer就指向變量i。假設(shè)定義變量i的時(shí)候,它分配的空間的首地址為2000。當(dāng)運(yùn)行i_pointer=&i的時(shí)候,指針變量中就存儲(chǔ)了變量i的地址2000。*i_pointer為指針變量i_pointer所指的存儲(chǔ)單元的內(nèi)容,也就是變量i的值10。指針處理人數(shù)變動(dòng)-指針操作符…....2000200420062005整型變量i10變量i_pointer2001200220032000指針變量第9頁,共30頁,2023年,2月20日,星期三typedefstruct{intyear;//年intmonth;//月intday;//日}Date;typedefstruct{charname[40];//學(xué)生姓名charsno[20];//學(xué)號(hào)charsid[20];//身份證號(hào)碼Datebirth;//出生日期charaddress[200];//家庭地址}Student;指針處理人數(shù)變動(dòng)-結(jié)構(gòu)類型指針snonamesidbirthaddress40字節(jié)20字節(jié)20字節(jié)12字節(jié)200字節(jié)……..……第10頁,共30頁,2023年,2月20日,星期三Studentstu={"張三","2010060501",,{1990,10,12},"廣東省廣州市天河區(qū)天河北路123號(hào)"};Student*stup;stup=&stu;可以把這個(gè)指針變量賦值,使得指針變量stup指向該結(jié)構(gòu)體變量stu。指針處理人數(shù)變動(dòng)-結(jié)構(gòu)類型指針snonamesidbirthaddress40字節(jié)20字節(jié)20字節(jié)12字節(jié)200字節(jié)張三201006050141020319901012304519901012廣東省廣州市天河區(qū)天河北路123號(hào)stup第11頁,共30頁,2023年,2月20日,星期三訪問結(jié)構(gòu)體變量成員的一般形式是:

結(jié)構(gòu)變量名.成員名

printf("學(xué)生基本信息:\n姓名=%s\n學(xué)號(hào)=%s\n身份證=%s\n出生日期=%d-%d-%d\n家庭地址=%s\n",,stu.sno,stu.sid,stu.birth.year,stu.birth.month,stu.birth.day,stu.address);也可以用指針變量來訪問該結(jié)構(gòu)體變量的各個(gè)成員,訪問結(jié)構(gòu)變量成員的一般形式是:

(*指針變量名).成員名或指針變量名->成員名printf("學(xué)生基本信息:\n姓名=%s\n學(xué)號(hào)=%s\n身份證=%s\n出生日期=%d-%d-%d\n家庭地址=%s\n",(*stup).name,(*stup).sno,(*stup).sid,(*stup).birth.year,(*stup).birth.month,(*stup).birth.day,(*stup).address);printf("學(xué)生基本信息:\n姓名=%s\n學(xué)號(hào)=%s\n身份證=%s\n出生日期=%d-%d-%d\n家庭地址=%s\n",stup->name,stup->sno,stup->sid,stup->birth.year,stup->birth.month,stup->birth.day,stup->address);指針處理人數(shù)變動(dòng)-結(jié)構(gòu)類型指針第12頁,共30頁,2023年,2月20日,星期三可利用指向結(jié)構(gòu)體數(shù)組的指針變量來讀取結(jié)構(gòu)體中第一個(gè)元素的內(nèi)容。Studentstu[50],*stup=&stu[0];printf("學(xué)生基本信息:姓名=%s,學(xué)號(hào)=%s,身份證=%s,出生日期=%d-%d-%d,家庭地址=%s\n",stup->name,stup->sno,stup->sid,stup->birth.year,stup->birth.month,stup->birth.day,stup->address);指針的后移就是用stup=stup+1;在這里指針后移就是第二個(gè)學(xué)生信息的首地址Studentstu[50],*stup=&stu[0];for(;stup<stu+50;stup++){printf("學(xué)生基本信息:姓名=%s,學(xué)號(hào)=%s,身份證=%s,出生日期=%d-%d-%d,家庭地址=%s\n",stup->name,stup->sno,stup->sid,stup->birth.year,stup->birth.month,stup->birth.day,stup->address);}指針處理人數(shù)變動(dòng)-結(jié)構(gòu)類型指針stu[0].snostu[0].namestu[0].sidstu[0].birthstu[0].address40字節(jié)20字節(jié)20字節(jié)12字節(jié)200字節(jié)張三201006050141020319901012304519901012廣東省廣州市天河區(qū)天河北路123號(hào)stup或stustu[1].snostu[1].namestu[1].sidstu[1].birthstu[1].address40字節(jié)20字節(jié)20字節(jié)12字節(jié)200字節(jié)李四20100605024202031989081720341989817北京市海淀區(qū)學(xué)院路810號(hào)stup+1或stu+1第13頁,共30頁,2023年,2月20日,星期三#include<stdio.h>voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;scanf("%d,%d",&a,&b);if(a<b)swap(a,b);

printf("\n%d,%d\n",a,b);}指針處理人數(shù)變動(dòng)-指針作為參數(shù)第14頁,共30頁,2023年,2月20日,星期三#include<stdio.h>voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);

printf("\n%d,%d\n",a,b);}指針處理人數(shù)變動(dòng)-指針作為參數(shù)第15頁,共30頁,2023年,2月20日,星期三#include<stdio.h>voidswap(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;int*pointer_1,*pointer_2;scanf("%d,%d",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);

printf("\n%d,%d\n",a,b);}指針處理人數(shù)變動(dòng)-指針作為參數(shù)第16頁,共30頁,2023年,2月20日,星期三malloc函數(shù)函數(shù)的原型為:

void*malloc(unsignedintsize);其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。此函數(shù)返回一個(gè)指向分配域起始地址的指針。如果該函數(shù)沒有能成功執(zhí)行,如內(nèi)存空間不足,則返回一個(gè)空指針。下列語句申請(qǐng)一個(gè)前面定義的結(jié)構(gòu)體所占空間,即292個(gè)字節(jié)大小。同時(shí)將申請(qǐng)空間的首地址賦給一個(gè)結(jié)構(gòu)體類型的指針變量。Student*stup;stup=(Student*)malloc(sizeof(Student));其中的(Student*)稱為強(qiáng)制轉(zhuǎn)換:因?yàn)閙alloc函數(shù)的返回值是指向void的指針,如果我們將這個(gè)返回值直接賦給stup指針變量,會(huì)出現(xiàn)編譯錯(cuò)誤。而進(jìn)行這個(gè)強(qiáng)制轉(zhuǎn)換,就是為了告訴編譯器:我們知道這個(gè)類型不匹配問題,但是沒關(guān)系,請(qǐng)不要把它當(dāng)做錯(cuò)誤對(duì)待。指針處理人數(shù)變動(dòng)-malloc函數(shù)申請(qǐng)空間第17頁,共30頁,2023年,2月20日,星期三Free函數(shù)的函數(shù)原型為:voidfree(void*p)其作用是釋放由p指向的內(nèi)存區(qū),從而使得這部分內(nèi)存區(qū)能被其他變量使用。該函數(shù)沒有返回值。如上面申請(qǐng)了空間。然后可以釋放該空間:free(stup);有了存儲(chǔ)空間的分配和釋放庫函數(shù),在案例程序“學(xué)生信息管理系統(tǒng)”中就可以根據(jù)實(shí)際情況進(jìn)行存儲(chǔ)空間的動(dòng)態(tài)分配。首先確定要保存的學(xué)生信息數(shù)量,然后就可以動(dòng)態(tài)分配空間了。printf("請(qǐng)輸入要錄入的學(xué)生總數(shù):");scanf("%d",&total);stup=(Student*)malloc(total*sizeof(Student));指針處理人數(shù)變動(dòng)-free函數(shù)釋放空間第18頁,共30頁,2023年,2月20日,星期三Studentstu[50]改為Student*stu加上#include<malloc.h>修改insert()函數(shù)案例實(shí)施-用指針處理學(xué)生人數(shù)變動(dòng)第19頁,共30頁,2023年,2月20日,星期三intinsert(){while(total<=0){printf("請(qǐng)輸入要錄入的學(xué)生總數(shù):");scanf("%d",&total);}if(stu==NULL)stu=(Student*)malloc(total*sizeof(Student));if(stu==NULL)return1;if(current>=total){ printf("對(duì)不起,由于人數(shù)已滿,不能再添加新學(xué)生信息\n"); return1;}printf("請(qǐng)輸入學(xué)生姓名:");scanf("%s",stu[current].name);printf("請(qǐng)輸入學(xué)生學(xué)號(hào):");scanf("%s",stu[current].sno);printf("請(qǐng)輸入學(xué)生身份證號(hào)碼:");scanf("%s",stu[current].sid);printf("請(qǐng)輸入學(xué)生出生日期,格式(年-月-日):");scanf("%d-%d-%d",&stu[current].birth.year,&stu[current].birth.month,&stu[current].birth.day); printf("請(qǐng)輸入學(xué)生家庭地址:");scanf("%s",stu[current].address); current++; return0;}案例實(shí)施-用指針處理學(xué)生人數(shù)變動(dòng)第20頁,共30頁,2023年,2月20日,星期三處理“圖書信息管理系統(tǒng)”的動(dòng)態(tài)圖書數(shù)據(jù)至此,已經(jīng)完成對(duì)存儲(chǔ)學(xué)生信息的存儲(chǔ)空間動(dòng)態(tài)分配。現(xiàn)在到了你管理圖書信息存儲(chǔ)空間動(dòng)態(tài)分配的時(shí)候了。繼續(xù)完善你的案例程序,使之可以對(duì)圖書信息存儲(chǔ)空間的動(dòng)態(tài)分配。具體要求:(1)編寫能管理圖書存儲(chǔ)空間動(dòng)態(tài)分配的案例程序;(2)在codeBlocks環(huán)境下調(diào)試你的程序,使之正確運(yùn)行。學(xué)生練習(xí)第21頁,共30頁,2023年,2月20日,星期三首先定義一個(gè)簡(jiǎn)單類型的數(shù)組和一個(gè)指針變量,同時(shí)使指針變量指向該數(shù)組。inta[6];int*p;p=a;C語言規(guī)定數(shù)組名代表數(shù)組的首地址,也就是第1個(gè)元素的地址,同時(shí)它是常量。所以下面的兩個(gè)語句等價(jià):p=&a[0];p=a;現(xiàn)在雖然a和p都是表示數(shù)組中第一個(gè)元素的地址。但是他們是有區(qū)別的,a是指針常量,p是指針變量。可以有語句p++或p--,但是不能有a++和a--?,F(xiàn)在可以通過指針來引用數(shù)組元素了。拓展-指向一維數(shù)組的指針變量main(){inta[6],i;int*p;p=a;for(i=0;i<6;i++)*(p+i)=i;for(i=0;i<6;i++)printf("a[%d]=%d\n",i,*(p+i));}第22頁,共30頁,2023年,2月20日,星期三1、p+i和a+i就是a[i]的地址,或說他們都是指向a數(shù)組的第i+1個(gè)元素。2、*(p+i)和*(a+i)就是p+i和a+i所指向的數(shù)組元素,即a[i]拓展-指向一維數(shù)組的指針變量pp+1,a+1a[1]a[0]a[i]a[5]…..…..p+i,a+ip+5,a+5第23頁,共30頁,2023年,2月20日,星期三main(){inta[6],i;for(i=0;i<6;i++)a[i]=i;for(i=0;i<6;i++)printf("a[%d]=%d\n",i,a[i]);}拓展-指向一維數(shù)組的指針變量main(){inta[6],i;for(i=0;i<6;i++)*(a+i)=i;for(i=0;i<6;i++)printf("a[%d]=%d\n",i,*(a+i));}main(){inta[6],i;int*p;p=a;for(i=0;i<6;i++)*(p+i)=i;for(i=0;i<6;i++)printf("a[%d]=%d\n",i,*(p+i));}第24頁,共30頁,2023年,2月20日,星期三定義二維數(shù)組:shortinta[3][4];假設(shè)數(shù)組a的首地址為2000,一個(gè)短整形數(shù)據(jù)在存儲(chǔ)空間中占2個(gè)字節(jié),并且是以行優(yōu)先進(jìn)行存儲(chǔ)。則該數(shù)組的各個(gè)元素的首地址和值如圖拓展-指向二維數(shù)組的指針變量a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2第25頁,共30頁,2023年,2月20日,星期三(1)a是數(shù)組名,它包含三個(gè)元素a[0]、a[1]、a[2],每個(gè)元素a[i]又是一個(gè)一維數(shù)組,包含4個(gè)元素。(2)a是二維數(shù)組的首地址,即第0行的首地址;a+i是第i行的首地址。(3)a[i]*(a+i),都是第i行第0列的元素地址(4)a[i]+j*(a+i)+j,都是第i行第j列的元素地址(5)*(a[i]+j)*(*(a+i)+j)a[i][j](6)a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同,a+i&a[i],表示第i行首地址,指向行;a[i]*(a+i)&a[i][0],表示第i行第0列元素地址,指向列。拓展-指向二維數(shù)組的指針變量第26頁,共30頁,20

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論