




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章指針理解指針和指針變量的概念掌握指針的使用方法及規(guī)范掌握使用指針和結(jié)構(gòu)體構(gòu)建復(fù)雜的數(shù)據(jù)類型本章目標(biāo)例子1:分別輸出不同類型數(shù)據(jù)在內(nèi)存中的地址。8.1變量與地址,不是一回事 intmax(inta,intb){ returna>b?a:b; } intmain(){ charch='a'; intnum=97; charcCName[50]; printf("ch的地址:%p\n",&ch); printf("num的地址:%p\n",&num); printf("cCName數(shù)組的地址%p\n",cCName); printf("max函數(shù)的地址:%p\n",max); return0; }預(yù)備知識(shí):內(nèi)存管理8.1輸出地址類型數(shù)據(jù)
內(nèi)存假設(shè):32位系統(tǒng)平臺(tái),虛擬存儲(chǔ)空間為4GB地址:字節(jié)編號(hào)byte:字節(jié),8個(gè)二進(jìn)制位預(yù)備知識(shí):地址的獲取和輸出8.1輸出地址類型數(shù)據(jù) printf("ch的地址:%p\n",&ch); printf("num的地址:%p\n",&num); printf("cCName數(shù)組的地址%p\n",cCName); printf("max函數(shù)的地址:%p\n",max);&:取地址運(yùn)算符,獲取變量的地址%p:輸出地址型數(shù)據(jù)請(qǐng)思考:是否可以使用%x來代替%p,它們有什么區(qū)別?指針的概念8.1輸出地址類型數(shù)據(jù)指針的兩個(gè)要素值類型內(nèi)存地址數(shù)據(jù)類型指針的概念8.1輸出地址類型數(shù)據(jù)變量”地址”和”內(nèi)容”i的地址i的內(nèi)容scanf(“%d%d”,&i,&j);是如何訪問變量i和j的?8.2換個(gè)方式用變量指針引用法輸入輸出中國(guó)人口和面積。 #include"stdio.h" intmain(){ doubledPopulation; doubledTerritorialArea; double*pP,*pTA;//定義指針變量 pP=&dPopulation;//pP指向變量dPopulation pTA=&dTerritorialArea;//pTA指向變量dTerritorialArea printf("請(qǐng)輸入中國(guó)人口(/億)\n"); scanf("%lf",pP);//使用指針變量pP輸入人口 printf("請(qǐng)輸入中國(guó)面積(/萬平方公里)\n"); scanf("%lf",pTA);//使用指針變量pTA輸入面積 //指針變量*pP,*pTA引用dPopulation和dTerritorialArea printf("中國(guó)人口數(shù)量:%lf億\n國(guó)土面積:%lf萬平方公里\n",*pP,*pTA); return0; }8.2使用指針輸入輸出中國(guó)的人口和面積如何定義指針變量類型名*指針變量名;例如:int*pointer_i;//定義一個(gè)整型指針變量float*pointer_j;//定義一個(gè)浮點(diǎn)型指針變量8.2使用指針輸入輸出中國(guó)的人口和面積如何使用指針變量例如:pointer_i=&i;//i的地址賦值給pointer_ipointer_j=&j;//j的地址賦值給pointer_j變量i的地址變量j的地址變量pointer_i的地址變量pointer_j的地址8.2使用指針輸入輸出中國(guó)的人口和面積如何使用指針變量 #include"stdio.h" intmain(){ intnum=97; int*pointer_num=NULL; pointer_num=# printf("pointer_num的地址:%p\n",&pointer_num); printf("pointer_num的值為:%p\n",pointer_num); printf("num的地址:%p\n",&num); return0; }輸出地址8.2使用指針輸入輸出中國(guó)的人口和面積如何使用指針變量 #include"stdio.h" intmain(){ intnum=0; int*pointer_num; pointer_num=#
scanf(“%d”,pointer_num); printf("pointer_num的值為:%p\n",pointer_num); printf("pointer_num所指向的變量值:%d\n",*pointer_num); printf("num的值:%d\n",num); return0;10
}輸出地址和值為什么上面代碼的scanf函數(shù)中pointer_num前不加&?8.2使用指針輸入輸出中國(guó)的人口和面積如何使用指針變量 #include"stdio.h" intmain(){
int*pointer_num;
scanf("%d",pointer_num); printf("%d\n",*pointer_num); return0; }野指針問題解決野指針確定的地址NULL指針8.2使用指針輸入輸出中國(guó)的人口和面積使用指針變量交換變量的值1 #include"stdio.h" intmain(){ inta=97,b=98;//定義兩個(gè)變量 int*pointer_a=&a,*pointer_b=&b,*pointer_t=NULL;//定義三個(gè)指針 //交換指針變量的值 pointer_t=pointer_a; pointer_a=pointer_b; pointer_b=pointer_t; printf("a的值為:%d,b的值為:%d\n",a,b);//輸出兩個(gè)變量的值 return0; }代碼1-4哪個(gè)能成功?8.2使用指針輸入輸出中國(guó)的人口和面積使用指針變量交換變量的值2 #include"stdio.h" intmain(){ inta=97,b=98;//定義兩個(gè)變量 int*pointer_a=&a,*pointer_b=&b;//定義兩個(gè)指針 int*pointer_t=NULL;//定義一個(gè)指針 //交換指針變量的值 *pointer_t=*pointer_a; *pointer_a=*pointer_b; *pointer_b=*pointer_t; printf("a的值為:%d,b的值為:%d\n",a,b);//輸出兩個(gè)變量的值 return0; }代碼1-4哪個(gè)能成功?8.2使用指針輸入輸出中國(guó)的人口和面積使用指針變量交換變量的值3 #include"stdio.h" intmain(){ inta=97,b=98,t=0;//定義兩個(gè)變量 int*pointer_a=&a,*pointer_b=&b,*pointer_t=&t;//定義三個(gè)指針 //交換指針變量的值 *pointer_t=*pointer_a; *pointer_a=*pointer_b; *pointer_b=*pointer_t; printf("a的值為:%d,b的值為:%d\n",a,b);//輸出兩個(gè)變量的值 return0; }代碼1-4哪個(gè)能成功?8.2使用指針輸入輸出中國(guó)的人口和面積使用指針變量交換變量的值4 #include"stdio.h" intmain(){ inta=97,b=98,t=0;//定義兩個(gè)變量 int*pointer_a=&a,*pointer_b=&b;//定義兩個(gè)指針 //交換指針變量的值 t=*pointer_a; *pointer_a=*pointer_b; *pointer_b=t; printf("a的值為:%d,b的值為:%d\n",a,b);//輸出兩個(gè)變量的值 return0; }代碼1-4哪個(gè)能成功?8.3指針與數(shù)組查詢上合組織(SCO)成員國(guó)信息#include"stdio.h"#include"string.h"intmain(){char*cSCO[8]={"China","Russia","Tajikistan","Kyrgyzstan","Uzbekistan","India","Pakistan","Kazakhstan"};doubledPopulation[8]={14.4349,1.44,0.098,0.06362,0.347,13.8,2.25,0.1839};doubledTerritorialArea[8]={960,1709.82,14.31,19.99,44.89,298.0,79.6,272.9};charcSearch[50];double*pP,*pTA;inti,j;pP=dPopulation;pTA=dTerritorialArea;printf("請(qǐng)輸入待查詢的國(guó)家名\n");gets(cSearch);for(i=0;i<8;i++){ if(strcmp(cSCO[i],cSearch)==0){ printf("國(guó)家:");puts(cSearch);printf(“人口:%lf億\n國(guó)土面積:%lf萬
平方公里\n",*(pP+i),*(pTA+i));break; }}if(i==8)printf("國(guó)家名錯(cuò)誤!\n");return0;}8.3指針與數(shù)組使用指針訪問數(shù)組如何通過指向數(shù)組的指針變量訪問數(shù)組元素?inta[10]={0};int*pa;pa=&a[0];pa=a;*pa,*(pa+i),*pa++pa[i]指針訪問數(shù)組涉及的三個(gè)問題:定義什么類型的指針變量?指針變量如何指向數(shù)組?8.3指針與數(shù)組使用指針訪問數(shù)組#include"stdio.h" intmain(){ inta[10]={0},i=0; int*pa=NULL; pa=a; printf("請(qǐng)輸入10個(gè)整數(shù):\n"); for(;i<10;i++){ scanf("%d",pa+i); } printf("10個(gè)數(shù)組元素的值分別為:\n"); for(i=0;i<10;i++){ printf("%3d",*(pa+i)); } printf("\n"); return0; }請(qǐng)嘗試修改程序,分別使用*pa,*(pa+i),*pa++,pa[i]8.3指針與數(shù)組指針與字符串字符指針變量的定義:char*str="您好!";等價(jià)于:char*str;str="您好!";例: #include"stdio.h" intmain(){ char*str="SCO"; puts(str); return0; }字符指針變量和字符數(shù)組的異同。8.3指針與數(shù)組指針數(shù)組例: #include"stdio.h" intmain(){ char*cSCO[8]={"China","Russia","Kazakhstan", "Kyrgyzstan","Tajikistan", "Uzbekistan","India","Pakistan"}; for(inti=0;i<8;i++){ printf("%s\n",cSCO[i]); } }如何輸出排序后的結(jié)果。8.4函數(shù)中的指針指針變量作參數(shù)例: #include"stdio.h" intmain(){ voidexchange(int*p1,int*p2); inta=97,b=98,t=0; int*pointer_a=&a,*pointer_b=&b; //交換指針變量的值 exchange(pointer_a,pointer_b); printf("a的值為:%d,b的值為:%d\n",a,b); return0; } voidexchange(int*p1,int*p2){ intt=0; t=*p1; *p1=*p2; *p2=t; }8.4函數(shù)中的指針指針數(shù)組作參數(shù)#include"stdio.h"#include"string.h"intmain(){
voidsort(char*tcSCO[]);char*cSCO[8]={"China","Russia","Tajikistan","Kyrgyzstan","Uzbekistan","India","Pakistan","Kazakhstan"};inti=0;sort(cSCO);//數(shù)組名做函數(shù)的實(shí)參for(i=0;i<8;i++){printf("%d:%s\n",i+1,cSCO[i]);}}voidsort(char*tcSCO[]){ inti=0,j=0,t=0; char*temp=NULL; for(;i<7;i++){ t=i; for(j=i+1;j<8;j++){ if(strcmp(tcSCO[t],tcSCO[j])>0){ t=j; } } if(t!=i){ temp=tcSCO[i]; tcSCO[i]=tcSCO[t]; tcSCO[t]=temp; } } }8.4函數(shù)中的指針返回值為指針#include"stdio.h"intmain(){int*max(int*p1,int*p2);inta=0,b=0;int*pa=&a,*pb=&b,*p=NULL;scanf("%d%d",pa,pb);p=max(pa,pb);printf("%disbiggerone\n",*p);return0;}int*max(int*p1,int*p2){ if(*p1>*p2) returnp1; else returnp2;}8.4函數(shù)中的指針指向函數(shù)的指針類型名(*指針變量名)(函數(shù)參數(shù)列表)#include"stdio.h"intmain(){int*max(int*p1,int*p2);inta=0,b=0;int*pa=&a,*pb=&b,*p=NULL;int*(*pmax)(int*,int*)=NULL;scanf("%d%d",pa,pb);pmax=max;p=(*pmax)(pa,pb);pmax=add;printf("%disbiggerone\n",*p);p=(*pmax)(pa,pb);printf("%disbiggerone\n",*p);return0;}int*max(int*p1,int*p2){if(*p1>*p2)returnp1;elsereturnp2;}int*add(int*p1,int*p2){intt,*p=&t;t=*p1+*p2;returnp;}8.5結(jié)構(gòu)體指針使用結(jié)構(gòu)體類型的指針#include"stdio.h"#include"string.h"structSCO{charcCName[50];doubledPopulation;doubledTerritorialArea;};structSCO*search(structSCO*pCountry,char*pCName){inti;for(i=0;i<8;i++){if(strcmp((pCountry+i)->cCName,pCName)==0){returnpCountry+i;} }returnNULL;}intmain(){structSCOcountry[8]={{"China",14.4349,960},{"Russia",1.44,1709.82},{"Tajikistan",0.098,14.31},{"Kyrgyzstan",0.06362,19.99},{"Uzbekistan",0.347,44.89,{"India",13.8,298.0},
{"Pakistan",2.25,79.6},{"Kazakhstan",0.1839,272.9}};charcSearch[50];structSCO*pCountry=NULL;
//定義結(jié)構(gòu)體SCO類型的指針變量pCountry=country;
//使指針變量指向數(shù)組country的首地址printf("請(qǐng)輸入待查詢的國(guó)家名\n");gets(cSearch);if((pCountry=search(country,cSearch))!=NULL)printf("%10s:%7.2lf億人%7.2lf萬平方公里\n",pCountry->cCName,pCountry->dPopulation,pCountry->dTerritorialArea);elseprintf("國(guó)家名錯(cuò)誤!\n");return0;}8.5結(jié)構(gòu)體指針指向結(jié)構(gòu)體類型數(shù)據(jù)的指針——定義和使用結(jié)構(gòu)體類型名*指針變量名;例:structSCOcountry={“China”,144349,960};structSCO*pCountry;pCountry=&country;兩種引用方式:(*pCountry).cCNamepCountry->cCName8.5結(jié)構(gòu)體指針指向結(jié)構(gòu)體類型數(shù)組的指針——定義和使用結(jié)構(gòu)體類型名*指針變量名;例:structSCOcountry[2]={{"China",14.4349,960},{"Russia",1.44,1709.82}structSCO*pm=NULL;pCountry=country;請(qǐng)根據(jù)前面所學(xué),思考如何引用數(shù)組元素的數(shù)據(jù)。8.5結(jié)構(gòu)體指針動(dòng)態(tài)內(nèi)存分配——內(nèi)存分配方式在靜態(tài)存儲(chǔ)區(qū)域分配在棧上分配在堆上分配在程序編譯的時(shí)候就已經(jīng)分配好,在程序的整個(gè)運(yùn)行期間都存在。全局變量和static變量棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率高,容量有限。函數(shù)內(nèi)局部變量動(dòng)態(tài)內(nèi)存分配malloc()等函數(shù)申請(qǐng)任意大小及數(shù)量的內(nèi)存,使用free()函數(shù)釋放。8.5結(jié)構(gòu)體指針動(dòng)態(tài)內(nèi)存分配——void指針 #include"stdio.h" intmain(){ void*pv; inta,*pa=&a; char*pc="hello"; pv=pa; printf("pv=%p,p1=%p\n",pv,pa); pv=pc; printf("pv=%p,pc=%p\n",pv,pc); return0; }void*表示“無類型指針”,沒有數(shù)據(jù)類型上的區(qū)分。void類型的指針變量可以存儲(chǔ)任何類型的指針,但不指向某個(gè)類型的數(shù)據(jù)。請(qǐng)思考printf(“pv=%p,pa=%p\n”,pv,pa);的執(zhí)行結(jié)果。8.5結(jié)構(gòu)體指針動(dòng)態(tài)內(nèi)存分配——malloc函數(shù)例如:用malloc申請(qǐng)一塊長(zhǎng)度為length的整數(shù)類型長(zhǎng)度的內(nèi)存。int*p=(int*)malloc(sizeof(int)*length);函數(shù)原型:void*malloc(unsignedintsize)如何使用malloc申請(qǐng)1個(gè)SCO類型長(zhǎng)度的內(nèi)存?嘗試寫出來。功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。8.5結(jié)構(gòu)體指針動(dòng)態(tài)內(nèi)存分配——calloc函數(shù)函數(shù)原型:void*calloc(unsignedn,unsignedsize)如何使用calloc申請(qǐng)2個(gè)SCO類型長(zhǎng)度的內(nèi)存?嘗試寫出來。功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為size的連續(xù)空間。8.5結(jié)構(gòu)體指針動(dòng)態(tài)內(nèi)存分配——free函數(shù)函數(shù)原型:voidfree(void*p)功能:釋放指針變址p所指向的動(dòng)態(tài)空間。(p應(yīng)是最近一次調(diào)用calloc()或malloc()函數(shù)得到的函數(shù)返回值)8.5結(jié)構(gòu)體指針使用指針與結(jié)構(gòu)體構(gòu)建鏈表——什么是鏈表單向鏈表頭指針頭節(jié)點(diǎn)尾節(jié)點(diǎn)節(jié)點(diǎn)地址8.5結(jié)構(gòu)體指針使用指針與結(jié)構(gòu)體構(gòu)建鏈表——構(gòu)建靜態(tài)鏈表#include"stdio.h"intmain(){structSCO*head=NULL,country1={"China",14.4349,960},country2={"Uzbekistan",0.347,44.89},*pCountry=NULL;head=&country1;country1.next=&country2;country2.next=NULL;pCountry=head;printf("上合組織成員國(guó)信息:\n");while(pCountry!=NULL){printf("%10s:%7.3lf億人%7.2lf萬平方公里\n",pCountry->cCName,pCountry->dPopulation,pCountry->dTerritorialArea);pCountry=pC
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第17課 明朝的滅亡和清朝的建立 教案2024-2025學(xué)年七年級(jí)歷史下冊(cè)新課標(biāo)
- “房地產(chǎn)主要的宣傳渠道及各種渠道效果”的調(diào)研調(diào)查問卷
- 湖北省武漢市江岸區(qū)2024-2025學(xué)年高三(上)期末生物試卷(含解析)
- 北京市朝陽區(qū)北京中學(xué)2023-2024學(xué)年高二下學(xué)期期中考試語文試題
- 樓頂廣告施工方案
- 隧道集水坑施工方案
- 箱梁混凝土施工方案
- 2025年8d考核試題及答案
- 6年級(jí)數(shù)學(xué)手抄報(bào)題材
- 玻璃厚度幕墻施工方案
- 2025年徐州生物工程職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫含答案
- 2025年廣東江門中醫(yī)藥職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫參考答案
- 2025年阜陽職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫帶答案
- 2025年新公司法知識(shí)競(jìng)賽題庫與答案
- 2025年新人教版物理八年級(jí)下冊(cè)全冊(cè)教案
- 形象設(shè)計(jì)師三級(jí)習(xí)題庫及答案
- 2025上半年四川綿陽市北川縣事業(yè)單位招聘工作人員擬聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 廠中廠安全知識(shí)培訓(xùn)
- 高速鐵路設(shè)計(jì)規(guī)范-12.綜合接地(第一稿)提交
- 北京化工大學(xué)《微機(jī)原理及接口技術(shù)》2021-2022學(xué)年第一學(xué)期期末試卷
- 紅樓夢(mèng)人物關(guān)系圖譜(真正可A4打印版)
評(píng)論
0/150
提交評(píng)論