《C語(yǔ)言程序設(shè)計(jì)》課件 09 指針_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件 09 指針_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件 09 指針_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件 09 指針_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)》課件 09 指針_第5頁(yè)
已閱讀5頁(yè),還剩52頁(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)介

程序設(shè)計(jì)基礎(chǔ)——C語(yǔ)言程序設(shè)計(jì)

2023翻轉(zhuǎn)課堂實(shí)用教程第09章指針指針9.1指針與函數(shù)9.2

指針與數(shù)組9.39.1指針123指針的概念指針變量的定義與使用指針變量的運(yùn)算知識(shí)點(diǎn)指針的案例分析案例分析指針相關(guān)練習(xí)題練習(xí)題9.1.1指針知識(shí)點(diǎn)程序在運(yùn)行時(shí),會(huì)為變量分配內(nèi)存空間。分配的內(nèi)存空間會(huì)有一個(gè)唯一的地址編號(hào),在C語(yǔ)言中又叫做指針。通過(guò)指針可以找到該內(nèi)存單元。地址取值范圍:(32位系統(tǒng)為例)32位系統(tǒng)的內(nèi)存條,32個(gè)元件,232個(gè)組合=4*230,4GB內(nèi)存。內(nèi)存地址編號(hào)從0X00000000到0XFFFFFFFF(十六進(jìn)制表示)指針的概念指針變量保存某個(gè)內(nèi)存空間的地址,并對(duì)該內(nèi)存空間中的值進(jìn)行操作。指針變量的定義方式為:數(shù)據(jù)類型名*指針變量名;或者數(shù)據(jù)類型名*指針變量名=地址值;1.指針變量的定義與使用指針變量指向的變量的數(shù)據(jù)類型指針變量聲明符保存的是某個(gè)變量的地址int*pInt;//指向int型變量的指針char*pStr=NULL;//NULL為空指針,stdio.hint*pInt1,*pInt2;9.1.1指針知識(shí)點(diǎn)舉例:doublenum=3.14;double*pDouble=#//定義一個(gè)指向double型變量num的指針pDouble1.指針變量的定義與使用指針變量pDouble指向num示意圖&num3.14pDoublenum&取地址運(yùn)算符,num的地址pDouble指向num9.1.1指針知識(shí)點(diǎn)指針變量占用的內(nèi)存大小,僅與地址信息的大小有關(guān),與類型無(wú)關(guān)。#include<stdio.h>intmain(){inta=100;charc='C';doubled=3.14;int*pInt=&a;char*pStr=&c;double*pDouble=&d;//分別輸出int指針、字符指針、浮點(diǎn)型指針占用的字節(jié)數(shù)printf("%d%d%d",sizeof(pInt),sizeof(pStr),sizeof(pDouble));return0;}1.指針變量的定義與使用運(yùn)行結(jié)果(64位系統(tǒng),8個(gè)字節(jié))8889.1.1指針知識(shí)點(diǎn)(1)取內(nèi)容與取地址通過(guò)變量的地址/指針,同樣可以訪問(wèn)到該變量的值。#include<stdio.h>intmain(void){ int*p,a=3; p=&a;

//兩種獲取變量a的方式,*p和a等價(jià)。 printf("*p的值為:%d,a的值為:%d\n",*p,a); *p=6;//通過(guò)指針p可以修改a的值 printf("*p的值為:%d,a的值為:%d\n",*p,a); return0;}2.指針變量的運(yùn)算取內(nèi)容,*p:p指向的變量a的值,等價(jià)取地址,&a:a的地址運(yùn)行結(jié)果:*p的值為:3,a的值為:3*p的值為:6,a的值為:6&a3

pa*p9.1.1指針知識(shí)點(diǎn)(2)賦值運(yùn)算doublenum=3.14,value=0.618;double*pDouble1=&num,*pDouble2;//(a)pDouble1=&value;//(b)修改pDouble1的值,讓其指向value變量pDouble2=pDouble1;//(c)2.指針變量的運(yùn)算(a)(b)(c)9.1.1指針知識(shí)點(diǎn)(3)加法、減法和比較運(yùn)算指針變量還可以進(jìn)行加法、減法和比較運(yùn)算,一般當(dāng)指針變量指向數(shù)組中的元素時(shí),才有實(shí)際的含義。2.指針變量的運(yùn)算9.1.1指針知識(shí)點(diǎn)指針變量只能與整數(shù)常量i進(jìn)行加減法運(yùn)算,加或減同類型數(shù)據(jù)長(zhǎng)度的i倍,指針往后或往前移動(dòng)i個(gè)同類型的數(shù)據(jù)。指針pI的加減運(yùn)算圖#include<stdio.h>intmain(){

inta=30,*p=&a,*pI=&a;

doubleb=3.14,*pD=&b;

charc='C',*pC=&c;

//前3個(gè)輸出語(yǔ)句,輸出各個(gè)類型占用的字節(jié)數(shù)

printf("sizeof(int)is%d\n",sizeof(int));

printf("sizeof(double)is%d\n",sizeof(double));

printf("sizeof(char)is%d\n",sizeof(char));

printf("初始值,pI:%#X,pD:%#X,pC:%#X\n",pI,pD,pC);//第4個(gè)輸出,先輸出各個(gè)指針的最初值

pI--;pD=pD-1;pC--;//第5個(gè)輸出,輸出-1后的值

printf("地址-1后,pI:%#X,pD:%#X,pC:%#X\n",pI,pD,pC);

pI+=2;pD+=2;pC+=2;//第6、7個(gè)輸出

printf("地址+2后,pI:%#X,pD:%#X,pC:%#X\n",pI,pD,pC);

printf("*pI:%d,*pD:%f,*pC:%c\n",*pI,*pD,*pC);

if(p==pI)printf("p和pI值相同,指向同一變量。");//第8個(gè)輸出,比較p和pI指針

elseprintf("p和pI值不同。");

return0;}9.1.1指針知識(shí)點(diǎn)運(yùn)行結(jié)果:sizeof(int)is4sizeof(double)is8sizeof(char)is1初始值,pI:0X62FE04,pD:0X62FDF8,pC:0X62FDF7地址-1后,pI:0X62FE00,pD:0X62FDF0,pC:0X62FDF6地址+2后,pI:0X62FE08,pD:0X62FE00,pC:0X62FDF8*pI:6487544,*pD:0.000000,*pC:p和pI值不同。(3)加法、減法和比較運(yùn)算%#X是輸出以0X開頭的十六進(jìn)制地址。9.1.2指針案例分析案例9.1.1指針變量運(yùn)算案例分析#include<stdio.h>intmain(void){ int*p,*pI,a=3; double*pD,num=0.618; pI=&a;//p指向a printf("*pI的值為:%d,a的值為:%d\n\n",*pI,a);

//修改a變量的值,*p的值也跟著改變 a=33; printf("*pI的值為:%d,a的值為:%d\n\n",*pI,a);

//修改*p變量的值,a的值也跟著改變 (*pI)++; printf("*pI的值為:%d,a的值為:%d\n\n",*pI,a); //同類型的指針可以相互賦值,兩者指向同一個(gè)變量a p=pI; printf("*p的值為%d,*pI的值為%d,a的值為%d\n",*p,*pI,a); //以十六進(jìn)制形式輸出p和pI的值,均為a的地址 printf("a的地址為%#0X;",&a); printf("p和pI的值為%#0X和%#0X\n\n",p,pI);

pD=# //*pD就是num的值0.618,*p就是a的值34 *pD=*pD+*p; //執(zhí)行完上面代碼后,*pD和num的值均變?yōu)榱?4.618 printf("*pD的值為:%f,num的值為:%f",*pD,num);return0;}*pI的值為:3,a的值為:3*pI的值為:33,a的值為:33*pI的值為:34,a的值為:34

*p的值為34,*pI的值為34,a的值為34a的地址為0X62FE04;p和pI的值為0X62FE04和0X62FE04

*pD的值為:34.618000,num的值為:34.618000課堂練習(xí)題9.1.1寫出執(zhí)行下面程序后的輸出結(jié)果#include<stdio.h>intmain(){ inta=2,b=3; int*p1=&a,*p2=&b; printf("p1指向的值為:%d,p2指向的值為%d\n",*p1,*p2); p2=p1; *p2=b; printf("p1指向的值為:%d,a的值為%d",*p1,a); return0;}9.1.3指針課堂練習(xí)題課堂練習(xí)題9.1.2查找下面程序中的2處錯(cuò)誤。輸入a和b,并定義指針p1和p2分別指向a和b,通過(guò)取指針值的方式計(jì)算a和b的和,并輸出和。#include<stdio.h>intmain(){ inta,b; int*p1,*p2; p1=&a,p2=&b; scanf("%d%d",&a,&p2); printf("a+b=%d",p1+*p2); return0;}課堂練習(xí)題9.1.3參照案例9.1.1,自行設(shè)計(jì)一個(gè)對(duì)指針操作的程序,并分析程序運(yùn)行的結(jié)果。9.1.3指針課堂練習(xí)題9.2指針與函數(shù)123指針變量作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)知識(shí)點(diǎn)指針與函數(shù)案例分析案例分析指針與函數(shù)相關(guān)練習(xí)題練習(xí)題指針變量作為函數(shù)的參數(shù)時(shí):將函數(shù)外部某些變量的地址傳遞到函數(shù)內(nèi)部,在函數(shù)內(nèi)部通過(guò)這些外部變量的地址操作這些外部變量。1.指針變量作為函數(shù)的參數(shù)9.2.1指針與函數(shù)知識(shí)點(diǎn)案例9.2.1編寫calculate函數(shù)來(lái)計(jì)算兩個(gè)double類型變量a和b的和與差,并將和sum與差diff返回給main函數(shù)。9.2.1指針與函數(shù)知識(shí)點(diǎn)對(duì)于需要函數(shù)返回多個(gè)值的情況:可以將這兩個(gè)變量sum和diff定義為全局變量(案例8.2.1);還可以將這兩個(gè)變量作為函數(shù)的入?yún)ⅰ?shù)該如何傳遞?9.2.1指針與函數(shù)知識(shí)點(diǎn)#include<stdio.h>voidcalculate(intsum,intdiff,inta,intb){ sum=a+b; diff=(a>b?a-b:b-a); printf("Incalculate,sumis%d,diffis%d\n",sum,diff);}intmain(){ inta,b,sum=0,diff=0; printf("請(qǐng)輸入整型a和b的值:"); scanf("%d%d",&a,&b); calculate(sum,diff,a,b); printf("Inmain,sumis%d,diffis%d",sum,diff); return0;}請(qǐng)輸入整型a和b的值:2310↙Incalculate,sumis33,diffis13Inmain,sumis0,diffis0案例9.2.1程序代碼(錯(cuò)誤實(shí)例)calculate()函數(shù)中計(jì)算出來(lái)sum和diff的值,這個(gè)結(jié)果并沒(méi)有返回給calculate()函數(shù)的調(diào)用者main()。分析原因(1)calculate與main中的sum和diff,不同變量,作用域不同、所占內(nèi)存空間不同。(2)sum、diff、a、b的值單向依次傳給了calculate()的形式參數(shù)。以值傳遞,傳遞的是數(shù)值。9.2.1指針與函數(shù)知識(shí)點(diǎn)#include<stdio.h>voidcalculate(int*pSum,int*pDiff,inta,intb){ *pSum=a+b; *pDiff=(a>b?a-b:b-a);}intmain(){ inta,b,sum=0,diff=0; printf("請(qǐng)輸入整型a和b的值:"); scanf("%d%d",&a,&b); calculate(&sum,&diff,a,b); printf("sumis%d,diffis%d",sum,diff); return0;}請(qǐng)輸入整型a和b的值:2310↙sumis33,diffis13案例9.2.1程序代碼(正確實(shí)例)main()函數(shù)將sum和diff的地址值傳給形參calculate中的pSum、pDiff;calculate中*pSum和*pDiff就是sum和diff。以值傳遞,傳遞的是地址信息。總結(jié),通過(guò)函數(shù)調(diào)用改變某個(gè)變量的值,需要滿足三個(gè)條件:①首先在主調(diào)函數(shù)中,傳入函數(shù)的實(shí)際參數(shù)需要是該變量地址;②其次函數(shù)的形參需要是與該變量同類型的指針;③最后在函數(shù)內(nèi)部,改變形參所指向的變量的值。用指針變量作為函數(shù)參數(shù)的方式,也可以實(shí)現(xiàn)函數(shù)返回多個(gè)變量的情況1.指針變量作為函數(shù)的參數(shù)9.2.1指針與函數(shù)知識(shí)點(diǎn)數(shù)組名實(shí)際上就是一個(gè)指針常量,主調(diào)函數(shù)將數(shù)組名傳遞給被調(diào)函數(shù)時(shí),僅僅是數(shù)組的首地址,在被調(diào)函數(shù)中無(wú)法獲得數(shù)組元素的個(gè)數(shù),還需要一個(gè)整型參數(shù)來(lái)表示數(shù)組的元素個(gè)數(shù)。2.?dāng)?shù)組名作為函數(shù)的參數(shù)9.2.1指針與函數(shù)知識(shí)點(diǎn)要求:輸入兩個(gè)整數(shù)a,b,編寫swap函數(shù),通過(guò)調(diào)用swap函數(shù)實(shí)現(xiàn)a和b的交換。問(wèn)題分析:如果希望通過(guò)函數(shù)調(diào)用改變a和b的值,需要滿足三個(gè)條件:①首先在主調(diào)函數(shù)中,傳入函數(shù)的實(shí)際參數(shù)需要是a和b的地址;②其次函數(shù)的形參需要是同類型的指針;③最后在函數(shù)內(nèi)部,改變形參所指向的變量的值。案例9.2.2定義函數(shù)交換兩個(gè)變量的值9.2.2指針與函數(shù)案例分析掃碼觀看視頻#include<stdio.h>voidswap(int*pA,int*pB){ inttmp; tmp=*pA; *pA=*pB; *pB=tmp;}intmain(){ inta,b; printf("請(qǐng)輸入整型a和b的值:"); scanf("%d%d",&a,&b); swap(&a,&b); printf("Afterswap,ais%d,bis%d",a,b); return0;}案例9.2.2

代碼請(qǐng)輸入整型a和b的值:2350↙afterswap,ais50,bis23ab2350pApB*pA*pBtmp2350239.2.2指針與函數(shù)案例分析案例9.2.3編寫冒泡排序函數(shù),對(duì)一個(gè)整型數(shù)組進(jìn)行排序,并編寫代碼驗(yàn)證排序的正確性。9.2.2指針與函數(shù)案例分析冒泡排序動(dòng)畫演示16216517590160將視頻中5口之家的身高,存到數(shù)組hhh[0]h[1]h[2]h[3]h[4]奶奶身高媽媽身高爸爸身高寶寶身高爺爺身高9.2.2指針與函數(shù)案例分析案例9.2.3冒泡排序函數(shù)冒泡排序的原理是:從前往后,依次比較相鄰元素大小,

若相鄰元素順序不符合要求,則交換兩個(gè)元素,

直到所有的元素都有序,排序結(jié)束。n個(gè)數(shù)據(jù),排序n-1輪。依據(jù)排序原理,冒泡排序類似水中冒泡,如果要求數(shù)據(jù)從小到大排序,較大的數(shù)慢慢冒出來(lái),冒到數(shù)列的后面。如果從大到小排序,較小的數(shù)慢慢冒出來(lái),冒到數(shù)列的后面。

16216517590160第1次比較:16216517590160第2次比較:162165

17590160第3次比較:162

16590175160第4次比較:162

165901601755個(gè)數(shù)第一輪比較比較4次

162

16590160175第1次比較:

162165

90160175第2次比較:

162

90165160175第3次比較:162

90

1601651755個(gè)數(shù)第二輪比較比較3次已有序已有序

162

90

160165175第1次比較:

90162

160165175第2次比較:901601621651755個(gè)數(shù)第三輪比較比較2次已有序

90160162165175第2次比較:90160

1621651755個(gè)數(shù)第四輪比較比較1次即可排序成功已有序#include<stdio.h>intmain(void){inti,j,n,t,h[10]={162,165,175,90,160};n=5;

for(j=0;j<n-1;j++){

//第一輪比較if(h[j]>h[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}

for(j=0;j<n-2;j++){

//第二輪比較if(a[j]>a[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}

for(j=0;j<n-3;j++){

//第三輪比較

if(h[j]>h[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}for(j=0;j<n-4;j++){//第四輪比較if(h[j]>h[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}return0;}#include<stdio.h>intmain(void){inti,j,n,t,h[10]={162,165,175,90,160};n=5;

i=1;

for(j=0;j<n-i;j++){

//第一輪比較if(h[j]>h[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}

i=2;for(j=0;j<n-i;j++){

//第二輪比較if(h[j]>h[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}

i=3;

for(j=0;j<n-i;j++){

//第三輪比較

if(h[j]>h[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}

i=4;

for(j=0;j<n-i;j++){//第四輪比較if(h[j]>h[j+1]){ t=h[j];h[j]=h[j+1];h[j+1]=t;}}return0;}引入變量i冒泡排序算法-代碼段

inti,j,t;for(i=1;i<n;i++)for(j=0;j<n-i;j++) if(array[j]>array[j+1]){ t=array[j]; array[j]=array[j+1]; array[j+1]=t; }intmain(void){inti,a[10];for(i=0;i<10;i++)

scanf("%d",&a[i]);

sort(a,10);for(i=0;i<10;i++)

printf("%d",a[i]);

printf("\n");return0;}voidsort(int*array,intn){

int

i,j,t;for(i=1;i<n;i++)for(j=0;j<n-i;j++) if(array[j]>array[j+1]){ t=array[j]; array[j]=array[j+1]; array[j+1]=t; }}案例9.2.3冒泡排序函數(shù)983467再來(lái)看一個(gè)實(shí)例,數(shù)組aaa[0]a[1]a[2]a[3]a[4]a[5]采用冒泡排序算法,打印出每輪排序后數(shù)據(jù)序列有沒(méi)有發(fā)現(xiàn)什么問(wèn)題?如何對(duì)代碼進(jìn)行優(yōu)化?案例9.2.3冒泡排序算法優(yōu)化voidsort(int*array,intn){

int

i,j,t,flag=0;for(i=1;i<n;i++){

flag=0;for(j=0;j<n-i;j++) if(array[j]>array[j+1]){ t=array[j]; array[j]=array[j+1]; array[j+1]=t;

flag=1; }

if(flag==0)break;}}案例9.2.3冒泡排序算法優(yōu)化算法輸入n(n<10),再輸入n個(gè)數(shù),用選擇法將它們從小到大排序后輸出。

每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,存放在序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到全部待排序的數(shù)據(jù)元素排完。設(shè)n=5,輸入的5個(gè)數(shù)為:35281案例9.2.4選擇法排序第1輪:

1

5283

第2輪:12

583第3輪:123

8

5

第4輪:1235

8

下標(biāo)值0123435281下標(biāo)值0123435281第1輪:

1

5283

從0~4中選擇最小的,放在0位置

第2輪:12

583

從1~4中選擇最小的,放在1位置第3輪:1238

5

從2~4中選擇最小的,放在2位置

第4輪:1235

8

從3~4中選擇最小的,放在3位置min_index=0;for(j=1;j<n;j++)if(a[j]<a[min_index])min_index=jtmp=a[min_index];a[min_index]=a[0];a[0]=tmp;min_index=1;for(j=2;j<n;j++)if(a[j]<a[min_index])min_index=j;tmp=a[min_index];a[min_index]=a[1];a[1]=tmp;min_index=2;for(j=3;j<n;j++)if(a[j]<a[min_index])min_index=j;tmp=a[min_index];a[min_index]=a[2];a[2]=tmp;min_index=3;for(j=4;j<n;j++)if(a[j]<a[min_index])min_index=j;tmp=a[min_index];a[min_index]=a[3];a[3]=tmp;案例9.2.4選擇法排序5個(gè)數(shù)據(jù),排序4輪,n個(gè)數(shù)據(jù),排序n-1輪for(i=0;i<n-1;i++){//外循環(huán)n-1次min_index=i;for(j=i+1;j<n;j++)if(a[j]<a[min_index])min_index=j;

tmp=a[min_index];a[min_index]=a[i];a[i]=tmp;}

針對(duì)n個(gè)元素的數(shù)組兩層循環(huán)(1)外循環(huán)外循環(huán),即執(zhí)行n-1輪選擇。則循環(huán)變量k取值從0到n-2(2)內(nèi)循環(huán)即每一輪做的事兒:從i到n-1中選擇最小值并與i位置的元素交換min_index=0;for(j=1;j<n;j++)if(a[j]<a[min_index])min_index=jtmp=a[min_index];a[min_index]=a[0];a[0]=tmp;min_index=1;for(j=2;j<n;j++)if(a[j]<a[min_index])min_index=j;tmp=a[min_index];a[min_index]=a[1];a[1]=tmp;min_index=2;for(j=3;j<n;j++)if(a[j]<a[min_index])min_index=j;tmp=a[min_index];a[min_index]=a[2];a[2]=tmp;min_index=3;for(j=4;j<n;j++)if(a[j]<a[min_index])min_index=j;tmp=a[min_index];a[min_index]=a[3];a[3]=tmp;案例9.2.4選擇法排序#include<stdio.h>voidselect_sort(inta[],intn){inti,j,min_index,tmp;for(i=0;i<n-1;i++){//外循環(huán)n-1次

min_index=i;for(j=i+1;j<n;j++)if(a[j]<a[min_index])min_index=j;tmp=a[min_index];a[min_index]=a[i];a[i]=tmp;}}5↙35281↙12358/*從i到n-1中找出最小值對(duì)應(yīng)的下標(biāo)*//*將最小值與i位置交換*/如果從大到小排序select_sort該如何修改?運(yùn)行結(jié)果intmain(void){inta[10]={0};inti,n;scanf("%d",&n);for(i=0;i<n;i++) scanf("%d",&a[i]);

select_sort(a,n);for(i=0;i<n;i++)printf("%d",a[i]);return0;}案例9.2.4選擇法排序設(shè)已有一個(gè)10個(gè)元素的整型數(shù)組a,且按值從小到大有序排列。輸入一個(gè)整數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的下標(biāo),否則,輸出“NotFound”。補(bǔ)充:二分法查找法

首先想到的是:順序查找算法,該算法簡(jiǎn)單明了,其查找過(guò)程就是對(duì)數(shù)組元素從頭到尾的遍歷過(guò)程。但是,當(dāng)數(shù)組很大時(shí),查找的效率不高。二分查找的效率較高,但前提是數(shù)組元素必須是有序的。二分法查找(流程圖)lowhighmidx<midx>midhighlowvoidbinary_search(inta[],intn,intx){intlow=0,high=n-1,mid;/*開始時(shí)查找區(qū)間為整個(gè)數(shù)組*/while(low<=high){/*循環(huán)條件*/mid=(low+high)/2;/*中間位置*/if(x==a[mid])break;/*查找成功,中止循環(huán)*/elseif(x<a[mid])high=mid-1;/*新查找區(qū)間為前半段,high前移*/elselow=mid+1;/*新查找區(qū)間為后半段,low后移*/}if(low<=high)printf("Indexis%d\n",mid);elseprintf("NotFound\n");}二分法查找

(數(shù)組名作為函數(shù)參數(shù))9.2.3指針與函數(shù)課堂練習(xí)題課堂練習(xí)題9.2.1運(yùn)行下面的代碼,查看swap1函數(shù)是否可以交換a和b變量的值?并分析原因。#include<stdio.h>voidswap1(int*pA,int*pB){ int*tmp; tmp=pA; pA=pB; pB=tmp;}intmain(){ inta,b; printf("請(qǐng)輸入整型a和b的值:"); scanf("%d%d",&a,&b); swap1(&a,&b); printf("Afterswap,ais%d,bis%d",a,b); return0;}9.2.3指針與函數(shù)課堂練習(xí)題課堂練習(xí)題9.2.2編寫函數(shù),求兩個(gè)整數(shù)的和與差,可采用傳入和與差的指針的形式。輸入兩個(gè)整數(shù)a和b,編寫函數(shù)calc來(lái)計(jì)算a-b和a+b。課堂練習(xí)題9.2.3:編寫函數(shù),通過(guò)身份證號(hào)計(jì)算年齡。函數(shù)有兩個(gè)形式參數(shù):一個(gè)是存儲(chǔ)身份證號(hào)的字符數(shù)組,另一個(gè)為整型指針,指向的是保存年齡的變量。9.3指針與數(shù)組123采用指針訪問(wèn)數(shù)組指針間的比較運(yùn)算知識(shí)點(diǎn)指針與數(shù)組案例分析案例分析指針與數(shù)組相關(guān)練習(xí)題練習(xí)題9.3.1指針與數(shù)組知識(shí)點(diǎn)數(shù)組名:數(shù)組的首地址,第一個(gè)元素的地址。若數(shù)組array元素類型為Type,則array值就和&array[0]一致,array的類型為Type*類型的指針常量。系統(tǒng)在為數(shù)組分配一塊連續(xù)的內(nèi)存空間后,數(shù)組的首地址就已經(jīng)確定了,除非銷毀,不會(huì)改變,所以為指針常量。為什么數(shù)組名是一個(gè)指針常量?9.3.1指針與數(shù)組知識(shí)點(diǎn)舉例:int*p,array[5]={30,20,50,10,40};p=array;p的值為&array[0],*p為array[0]p+i表示相對(duì)于當(dāng)前指針p往后偏移i個(gè)整數(shù)的位置(1)采用指針訪問(wèn)數(shù)組

array[0]array[1]array[2]array[3]array[4]3020501040

arrayarray+1

array+2array+3array+4p

p+1p+2p+3

p+49.3.1指針與數(shù)組知識(shí)點(diǎn)(1)采用指針訪問(wèn)數(shù)組采用指針獲取數(shù)組元素、地址的方式元素獲取內(nèi)容array[0]array[1]array[2]array[3]array[4]獲取元素的值array[0]*array*pp[0]array[1]*(array+1)*(p+1)p[1]array[2]*(array+2)*(p+2)p[2]array[3]*(array+3)*(p+3)p[3]array[4]*(array+4)*(p+4)p[4]獲取元素的地址&array[0]arrayp&array[1]array+1p+1&array[2]array+2p+2&array[3]array+3p+3&array[4]array+4p+4參見9.3.2章節(jié)中案例9.3.1的代碼及運(yùn)行結(jié)果數(shù)組名可以作為指針來(lái)使用,指針變量可以作為數(shù)組形式來(lái)使用。9.3.1指針與數(shù)組知識(shí)點(diǎn)(1)采用指針訪問(wèn)數(shù)組指針變量與數(shù)組名,兩者有什么區(qū)別呢?(1)p為指針變量,數(shù)組array是指針常量。p=array+i,array=array+i。(2)作為sizeof運(yùn)算符的操作數(shù)時(shí)sizeof(array):為array所代表的整個(gè)數(shù)組占用的總字節(jié)數(shù)。sizeof(p):為p指針占用的字節(jié)數(shù)數(shù)組名不可以作為賦值=左邊的操作數(shù)。9.3.1指針與數(shù)組知識(shí)點(diǎn)(1)采用指針訪問(wèn)數(shù)組舉例:intarray[5]={30,20,50,10,40},*p=array+2;p-1

是?p+2是?利用指針p,可以隨機(jī)從某一個(gè)元素開始往前往后訪問(wèn)數(shù)組元素。array[2]前面一個(gè)元素,p-1為&array[1]p+2為&array[4]9.3.1指針與數(shù)組知識(shí)點(diǎn)(2)指針間的比較運(yùn)算當(dāng)兩個(gè)指針均指向同一個(gè)數(shù)組中的元素時(shí),兩個(gè)指針可以進(jìn)行兩類運(yùn)算:

關(guān)系運(yùn)算:

><≠相減的運(yùn)算9.3.1指針與數(shù)組知識(shí)點(diǎn)(2)指針間的比較運(yùn)算舉例:intarray[5]={30,20,50,10,40};int*p1=&array[3],*p2=array,*p;3020501040arrayp1p2①

以下式子成立:p1>p2、p2<p1、p1≠p2基于上面的比較運(yùn)算,使用指針p作為循環(huán)變量,p:[array,&array[4]],p++,可以遍歷數(shù)組array的所有元素。for(p=array;p<=&array[N-1];p++){ printf("%d",*p);}或for(p=array;p<array+N;p++){ printf("%d",*p);}p1-p2為39.3.1指針與數(shù)組知識(shí)點(diǎn)(2)指針間的比較運(yùn)算舉例:3020501040arrayp1p2關(guān)系運(yùn)算、相減運(yùn)算結(jié)果備注p1>p2為真p1指向的數(shù)組元素的下標(biāo)大于p2指向的元素的下標(biāo),所以p1>p2為真p1<p2為假

p1==p2為假

p1-p23p1和p2之間相差3個(gè)存儲(chǔ)單元/3個(gè)元素指針間的比較運(yùn)算表9.3.2指針與數(shù)組案例分析案例9.3.1指針與數(shù)組關(guān)系的應(yīng)用#include<stdio.h>#defineN10intmain(){

int*p,array[N],i;

p=array;

for(i=0;i<N;i++){

scanf("%d",array+i);

}

//輸出元素的地址,每?jī)蓚€(gè)一行

for(i=0;i<N;i++){

printf("%#X",(array+i));

if((i+1)%2==0&&i!=9)printf("\n");

}

printf("\n");

//三種通過(guò)p指針來(lái)獲取元素值的代碼

for(i=0;i<N;i++){

printf("%d",*(p+i));

}

printf("\n");

for(i=0;i<N;i++){

printf("%d",p[i]);

}

printf("\n");

for(p=array;p<=&array[N-1];p++){

printf("%d",*p);

}

return0;}運(yùn)行結(jié)果:231045891357

溫馨提示

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