C語(yǔ)言程序設(shè)計(jì)-基于計(jì)算思維的培養(yǎng) 課件 第8章 指針_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)-基于計(jì)算思維的培養(yǎng) 課件 第8章 指針_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)-基于計(jì)算思維的培養(yǎng) 課件 第8章 指針_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)-基于計(jì)算思維的培養(yǎng) 課件 第8章 指針_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)-基于計(jì)算思維的培養(yǎng) 課件 第8章 指針_第5頁(yè)
已閱讀5頁(yè),還剩41頁(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)介

第八章指針目錄/Contents指針概念指針變量的定義和初始化取地址運(yùn)算符、間接尋址運(yùn)算符向函數(shù)傳遞指針變量函數(shù)指針問(wèn)題的提出intmain(){inta,b;a=5;b=9;Swap(a,b);printf("a=%d,b=%d",a,b);return0;}voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}為什么不工作?【例8.1】演示兩個(gè)整型變量的值交換。運(yùn)行結(jié)果:(屏幕顯示)a=5,b=9指針的概念內(nèi)存中的每個(gè)字節(jié)都有唯一的編號(hào)(地址)地址是一個(gè)十六進(jìn)制無(wú)符號(hào)整數(shù)其字長(zhǎng)一般與主機(jī)相同地址按字節(jié)編號(hào),按類型分配空間如何讀寫內(nèi)存中的數(shù)據(jù)?只要指明要訪問(wèn)的變量的內(nèi)存單元地址就可以立即訪問(wèn)到變量所在的存儲(chǔ)單元&ascanf("%d",&a);printf("%d",a);#include<stdio.h>intmain(){ inta=1,b=1; charc='A'; printf("a=%d\t,&a=%p\n",a,&a); printf("b=%d\t,&b=%p\n",b,&b); printf("c=%c\t,&c=%p\n",c,&c);}運(yùn)行結(jié)果:(屏幕顯示)a=1,&a=000000000062FE4Cb=1,&b=000000000062FE48c=A,&c=000000000062FE47指針的概念【例8.2】

運(yùn)用取地址運(yùn)算符&取出變量的地址,并將其顯示出來(lái)。指針概念間接尋址:通過(guò)存放變量地址的變量去訪問(wèn)變量&a如何讀寫內(nèi)存中的數(shù)據(jù)?指針變量的定義和初始化

存放變量的地址需要一種特殊類型的變量

指針(Pointer)類型

指針變量——具有指針類型的變量

變量的指針←→變量的地址

指針變量

指向

變量變量的地址(指針)變量值變量地址存入指針變量指針變量的定義和初始化【例8.3】

定義指針變量并顯示它的值。#include<stdio.h>intmain(){ inta=1; floatb=2.1; charc='A'; int*p1; float*p2; char*p3; printf("ais%d,\t&ais%p,\tp1is%p\n",a,&a,p1); printf("bis%.1f,\t&bis%p,\tp2is%p\n",b,&b,p2); printf("cis%c,\t&cis%p,\tp3is%p\n",c,&c,p3); return0;}運(yùn)行結(jié)果:(屏幕顯示)ais1,&ais000000000062FE34,p1is0000000000000001bis2.1,&bis000000000062FE30,p2is0000000000000000cisA,&cis000000000062FE2F,p3is0000000000000010指針變量使用之前必須初始化永遠(yuǎn)不要使用未初始化的指針變量定義了指針變量pa,但pa并未指向a?如果指針指向一個(gè)非你控制的內(nèi)存空間并對(duì)該空間進(jìn)行訪問(wèn),將可能造成危險(xiǎn)指針變量的定義和初始化#include<stdio.h>intmain(){ inta=1; floatb=2.1; charc='A'; int*p1; float*p2; char*p3; p1=&a; p2=&b; p3=&c; printf("ais%d,\t&ais%p,\tp1is%p,\tp1is%p\n",a,&a,p1,&p1); printf("bis%.1f,\t&bis%p,\tp2is%p,\tp2is%p\n",b,&b,p2,&p2); printf("cis%c,\t&cis%p,\tp3is%p,\tp3is%p\n",c,&c,p3,&p3); return0;}指針已經(jīng)有了名字,類型和值指針變量的定義和初始化#include<stdio.h>intmain(){ inta=1; floatb=2.1; charc='A'; int*p1; float*p2; char*p3; p1=&a; p2=&b; p3=&c; printf("ais%d,\t&ais%p,\tp1is%p,\tp1is%p\n",a,&a,p1,&p1); printf("bis%.1f,\t&bis%p,\tp2is%p,\tp2is%p\n",b,&b,p2,&p2); printf("cis%c,\t&cis%p,\tp3is%p,\tp3is%p\n",c,&c,p3,&p3); return0;}指針變量指向的數(shù)據(jù)類型稱為基類型指針變量只能指向同一基類型的變量間接尋址#include<stdio.h>intmain(){ inta=1; floatb=2.1; charc='A'; int*p1; float*p2; char*p3; p1=&a; p2=&b; p3=&c; printf("ais%d,\t&ais%p,\tp1is%p,\tp1is%p\n",a,&a,p1,&p1); printf("bis%.1f,\t&bis%p,\tp2is%p,\tp2is%p\n",b,&b,p2,&p2); printf("cis%c,\t&cis%p,\tp3is%p,\tp3is%p\n",c,&c,p3,&p3); return0;}【例8.4】

使用指針變量,通過(guò)間接尋址顯示變量的值。#include<stdio.h>intmain(){ inta=1; floatb=2.1; charc='A'; int*p1; float*p2; char*p3; p1=&a; p2=&b; p3=&c;*p1=5; printf("ais%d,\t&ais%p,\tp1is%p,\tp1is%p\n",a,&a,p1,&p1); printf("bis%.1f,\t&bis%p,\tp2is%p,\tp2is%p\n",b,&b,p2,&p2); printf("cis%c,\t&cis%p,\tp3is%p,\tp3is%p\n",c,&c,p3,&p3); return0;}引用指針?biāo)赶虻淖兞康闹捣Q為指針的解引用(PointerDereference)間接尋址值傳遞與地址傳遞普通變量作函數(shù)參數(shù)——按值調(diào)用,簡(jiǎn)稱值傳遞不能修改實(shí)參的值

形參←

實(shí)參變量指針作函數(shù)參數(shù)——按地址調(diào)用,簡(jiǎn)稱地址傳遞為了修改實(shí)參的值,使用:

指針形參←&實(shí)參a&apointerparameteraxparameterargument值傳遞與地址傳遞#include<stdio.h>voidSwap(inta,intb);intmain(){intx,y;printf("inputtwointegernumbers:");scanf("%d%d",&x,&y);Swap(x,y);printf("%d\t%d\n",x,y);return0;}voidSwap(inta,intb){ inttemp; temp=a; a=b; b=temp;}形參值的改變不會(huì)影響對(duì)應(yīng)的實(shí)參【例8.5】

用簡(jiǎn)單變量作為函數(shù)形參,實(shí)現(xiàn)兩個(gè)整數(shù)的交換。值傳遞與地址傳遞#include<stdio.h>voidSwap(int*p1,int*p2);intmain(){ intx,y; printf("inputtwointegernumbers:"); scanf("%d%d",&x,&y); Swap(&x,&y); printf("%d\t%d\n",x,y); return0;}voidSwap(int*p1,int*p2){ inttemp; temp=*p1; *p1=*p2; *p2=temp;}指針變量作函數(shù)參數(shù)可以修改實(shí)參的值值傳遞與地址傳遞voidSwap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}intmain(){intx,y;x=5;y=9;Swap(&x,&y);printf(“x=%d,y=%d",x,y);return0;}

voidSwap(inta,intb){inttemp;temp=a;a=b;b=temp;}intmain(){intx,y;x=5;y=9;Swap(x,y);printf(“x=%d,y=%d",x,y);return0;}程序1程序2主調(diào)函數(shù)被調(diào)函數(shù)實(shí)參形參結(jié)果有何不同?不能工作!為什么?intmain(){

intx,y;x=5;y=9;Swap(x,y);printf(“x=%d,y=%d",x,y);

return0;}voidSwap(inta,intb){

inttemp;temp=a;a=b;b=temp;}55xy實(shí)參形參99abxyab55temp9a

和b是內(nèi)部變量單向值傳遞主調(diào)函數(shù)被調(diào)函數(shù)intmain(){

intx,y;x=5;y=9;Swap(&x,&y);printf(“x=%d,y=%d",x,y);

return0;}voidSwap(int*p1,int*p2){

inttemp;temp=*p1;*p1=*p2;*p2=temp;}&x&x實(shí)參形參&y&yp1p2xyp1p25temp5xy995*p1*p2交換的是p1

和p2指向的單元內(nèi)容主調(diào)函數(shù)被調(diào)函數(shù)#include<stdio.h>voidSwap(int*p1,int*p2);intmain(){ intx,y; printf("inputtwointegernumbers:"); scanf("%d%d",&x,&y); Swap(&x,&y); printf("%d\t%d\n",x,y); return0;}voidSwap(int*p1,int*p2){ int*temp; *temp=*p1; *p1=*p2; *p2=*temp;}指針temp未初始化指針temp指向哪里未知對(duì)未知單元寫操作是危險(xiǎn)的永遠(yuǎn)要清楚:每個(gè)指針指向了哪里指針指向的內(nèi)容是什么不能工作!為什么?值傳遞與地址傳遞#include<stdio.h>voidSwap(int*p1,int*p2);intmain(){ intx,y; printf("inputtwointegernumbers:"); scanf("%d%d",&x,&y); Swap(&x,&y); printf("%d\t%d\n",x,y); return0;}voidSwap(int*p1,int*p2){inta; int*temp=&a; *temp=*p1; *p1=*p2; *p2=*temp;}值傳遞與地址傳遞#include<stdio.h>voidSwap(int*p1,int*p2);intmain(){ intx,y; printf("inputtwointegernumbers:"); scanf("%d%d",&x,&y); Swap(&x,&y); printf("%d\t%d\n",x,y); return0;}voidSwap(int*p1,int*p2){ int*temp; temp=p1; p1=p2; p2=temp;}指針temp被賦了值但交換的是地址值不是指針指向單元的內(nèi)容不能工作!為什么?值傳遞與地址傳遞指針變量作為函數(shù)參數(shù)應(yīng)用舉例【例8.6】

試分析下面的程序能否實(shí)現(xiàn)從鍵盤輸入某班學(xué)生某門課的成績(jī)和學(xué)號(hào)。輸入負(fù)數(shù)表示輸入結(jié)束,計(jì)算并顯示最高分及相應(yīng)學(xué)生的學(xué)號(hào)。intReadScore(inta[],longnum[]){inti=-1do{i++;printf("Inputstudent'sID&score:\n");scanf("%ld%d",&num[i],&a[i]);}while(num[i]>0&&a[i]>=0);returni;}voidGetMaxScore(inta[],longnum[],intn,intpmaxscore,longpmaxnum){inti;pmaxscore=a[0];pmaxnum=num[0];for(i=0;i<n;i++){if(a[i]>pmaxscore){ pmaxscore=a[i]; pmaxnum=num[i];}}}指針變量作為函數(shù)參數(shù)應(yīng)用舉例#include<stdio.h>#defineN40intReadScore(inta[],longnum[]);voidGetMaxScore(inta[],longnum[],intn,intpmaxscore,longpmaxnum);intmain(){ intscore[N],n,maxscore; longnum[N],maxnum; n=ReadScore(score,num); GetMaxScore(score,num,n,maxscore,maxnum); printf("maxscore=%d,\tmaxnum=%ld\n",maxscore,maxnum); return0;}真正的原因:普通變量作函數(shù)參數(shù)按值調(diào)用不能在被調(diào)函數(shù)中改變相應(yīng)的實(shí)參值運(yùn)行結(jié)果:(屏幕顯示)Inputstudent'sID&score:123201910186Inputstudent'sID&score:123201910290Inputstudent'sID&score:123201910375Inputstudent'sID&score:123201910469Inputstudent'sID&score:-1-1maxscore=1,maxnum=0不工作!為什么?指針變量作為函數(shù)參數(shù)應(yīng)用舉例#include<stdio.h>#defineN40intReadScore(inta[],longnum[]);voidGetMaxScore(inta[],longnum[],intn,int*pmaxscore,long*pmaxnum);intmain(){ intscore[N],n,maxscore; longnum[N],maxnum; n=ReadScore(score,num); GetMaxScore(score,num,n,&maxscore,&maxnum); printf("maxscore=%d,\tmaxnum=%ld\n",maxscore,maxnum); return0;}voidGetMaxScore(inta[],longnum[],intn,int*pmaxscore,long*pmaxnum){ inti; *pmaxscore=a[0]; *pmaxnum=num[0]; for(i=0;i<n;i++) { if(a[i]>*pmaxscore) { *pmaxscore=a[i]; *pmaxnum=num[i]; } }}運(yùn)行結(jié)果:(屏幕顯示)Inputstudent'sID&score:123201910189Inputstudent'sID&score:123201910295Inputstudent'sID&score:-1-1maxscore=95,maxnum=1232019102正常工作!指針變量作為函數(shù)參數(shù)應(yīng)用舉例【例8.7】

假設(shè)有一種球類比賽,它的比賽規(guī)則如下:①這是一種雙人比賽:包括球員A和B,采用回合制。②開始時(shí)一方發(fā)球,直至判分,接下來(lái)勝者發(fā)球。③球員只能在獲得發(fā)球權(quán)后得分,得15分勝1場(chǎng)。編寫程序,試根據(jù)球員的能力值分析n場(chǎng)比賽的勝負(fù)次數(shù)。指針變量作為函數(shù)參數(shù)應(yīng)用舉例指針變量作為函數(shù)參數(shù)應(yīng)用舉例voidPrintInfo();/*函數(shù)功能:輸出程序信息

函數(shù)參數(shù):無(wú)

函數(shù)返回值:無(wú)*/voidGetInputs(float*a,float*b,int*n);/*函數(shù)功能:輸入能力值

函數(shù)參數(shù):指向球員能力值的指針a和b,指向比賽場(chǎng)數(shù)的指針n

函數(shù)返回值:無(wú)*/voidSimNGames(float*proA,float*proB,int*scoreA,int*scoreB,int*winA,int*winB,intn);/*函數(shù)功能:模擬n場(chǎng)比賽

函數(shù)參數(shù):指向球員能力值的指針proA和proB,指向球員得分的指針scoreA和scoreB,指向球員勝負(fù)局?jǐn)?shù)的指針winA和winB,比賽場(chǎng)數(shù)n

函數(shù)返回值:無(wú)*/voidPrintSummary(float*proA,float*proB,int*scoreA,int*scoreB);/*函數(shù)功能:輸出比賽結(jié)果

函數(shù)參數(shù):指向球員能力值指針proA和proB,指向球員得分的指針scoreA和scoreB

函數(shù)返回值:無(wú)*/指針變量作為函數(shù)參數(shù)應(yīng)用舉例#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){intn=0;intscoreA=0,scoreB=0,winA=0,winB=0;floatproA,proB;srand(time(0));PrintInfo(); /*輸出程序信息*/GetInputs(&proA,&proB,&n); /*輸入能力值*/SimNGames(&proA,&proB,&scoreA,&scoreB,&winA,&winB,n);/*模擬n場(chǎng)比賽*/PrintSummary(winA,winB,n);/*輸出比賽結(jié)果*/return0;}指針變量作為函數(shù)參數(shù)應(yīng)用舉例指針變量作為函數(shù)參數(shù)應(yīng)用舉例voidSimNGames(float*proA,float*proB,int*scoreA,int*scoreB,int*winA,int*winB,intn){ for(i=0;i<n;i++)/*n是比賽場(chǎng)數(shù)*/ {

模擬1場(chǎng)比賽;

若球員A的得分超過(guò)球員B的得分

則A勝1場(chǎng);

否則 B勝1場(chǎng); }}voidSimOneGame(float*proA,float*proB,int*scoreA,int*scoreB);{

假設(shè)開始時(shí)發(fā)球方為A; while(!比賽結(jié)束) {

若發(fā)球方為A

若比賽局面形勢(shì)小于A的能力值,則 A得1分;

否則 B獲得發(fā)球權(quán);

否則

若發(fā)球方為B

若比賽局面形勢(shì)小于B的能力值,則 B得1分;

否則 A獲得發(fā)球權(quán); }}指針變量作為函數(shù)參數(shù)應(yīng)用舉例intGameOver(int*scoreA,int*scoreB){

若球員A獲得15分或球員B獲得15分,則

本場(chǎng)比賽結(jié)束;

否則

本場(chǎng)比賽沒(méi)有結(jié)束;}指針變量作為函數(shù)參數(shù)應(yīng)用舉例voidSimNGames(float*proA,float*proB,int*scoreA,int*scoreB,int*winA,int*winB,intn){ for(i=0;i<n;i++)/*n是比賽場(chǎng)數(shù)*/ { SimOneGame(proA,proB,scoreA,scoreB); /*模擬1場(chǎng)比賽*/ if(*scoreA>*scoreB) *winA+=1; else *winB+=1; }}指針變量作為函數(shù)參數(shù)應(yīng)用舉例voidSimOneGame(float*proA,float*proB,int*scoreA,int*scoreB){charserving='A';/*假設(shè)開始時(shí)發(fā)球方為A*/while(!GameOver(scoreA,scoreB)){/*1球比賽*/if(serving=='A')if(rand()/(RAND_MAX+1.0)<(*proA)) *scoreA+=1;else serving='B';elseif(serving=='B')if(rand()/(RAND_MAX+1.0)<(*proB)) *scoreB+=1; else serving='A';}}intGameOver(int*scoreA,int*scoreB){ if(*scoreA==15||*scoreB==15) return1; else return0;}指針變量作為函數(shù)參數(shù)應(yīng)用舉例voidPrintInfo(){printf("這個(gè)程序模擬兩個(gè)球員A和B的某種球類比賽\n");printf("程序運(yùn)行需要A和B的能力值(以0~1之間的小數(shù)表示)\n");}voidGetInputs(float*a,float*b,int*n){ printf("請(qǐng)輸入球員A的能力值(0~1):"); scanf("%f",a); printf("請(qǐng)輸入球員B的能力值(0~1):"); scanf("%f",b); printf("請(qǐng)輸入模擬比賽的場(chǎng)次:"); scanf("%d",n);}voidPrintSummary(intwinA,intwinB,intn){n=winA+winB;printf("分析開始,共模擬%d場(chǎng)比賽\n",n);printf("球員A獲勝%d場(chǎng)比賽,占比%.1f\n",winA,1.0*winA/n);printf("球員B獲勝%d場(chǎng)比賽,占比%.1f\n",winB,1.0*winB/n);}指針變量作為函數(shù)參數(shù)應(yīng)用舉例函數(shù)指針及其應(yīng)用函數(shù)指針(FunctionPointers)就是指向函數(shù)的指針(PointertoaFunction)格式:數(shù)據(jù)類型(*指針名)(形參列表);例如:有函數(shù)原型:floatFunc(floatx,floaty);則可以定義函數(shù)指針float(*p)(float,float);令p=Func;則表示函數(shù)指針指向函數(shù)Func()。編譯器將不帶()的函數(shù)名解釋為該函數(shù)的入口地址指向函數(shù)的指針變量存儲(chǔ)的是函數(shù)在內(nèi)存中的入口地址函數(shù)指針及其應(yīng)用如果有函數(shù)原型:char*Func(char*ch1,char*ch2);則可以定義函數(shù)指針char*(*p)(char*,char*);令p=Func;則表示函數(shù)指針指向函數(shù)Func()。若定義函數(shù)指針的參數(shù)類型與它指向的函數(shù)的參數(shù)類型不一致,則程序在編譯時(shí)會(huì)出錯(cuò)

char*(*p)(char,char);函數(shù)指針及其應(yīng)用常見(jiàn)錯(cuò)誤:忘記了前一個(gè)(),寫成int*p();/*聲明一個(gè)函數(shù)名為p、返回值是整型指針的函數(shù)*/忘掉了后一個(gè)(),寫成int(*p);

/*定義了一個(gè)整型指針*/定義時(shí)后一個(gè)括號(hào)內(nèi)的參數(shù)類型與指向的函數(shù)參數(shù)類型不匹配函數(shù)指針及其應(yīng)用運(yùn)行結(jié)果:(屏幕顯示)pleaseinputtwonumbers:25pleasechoose1or2:1max=5pleaseinputtwonumbers:25pleasechoose1or2:2min=2函數(shù)指針函數(shù)調(diào)用【例8.8】

輸入兩個(gè)整數(shù),然后讓用戶選擇1或2:選擇1,調(diào)用Max(),輸出二者中的較大數(shù);選擇2,調(diào)用Min(),輸出二者中的較小數(shù)。函數(shù)指針初始化函數(shù)指針及其應(yīng)用intMin(inta,intb){ intz; if(a<b) { z=a; } else { z=b; } returnz }intMax(inta,intb){ intz; if(a

溫馨提示

  • 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)論