




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
程序設(shè)計基礎(chǔ)——C語言程序設(shè)計
2023翻轉(zhuǎn)課堂實用教程第09章指針指針9.1指針與函數(shù)9.2
指針與數(shù)組9.39.1指針123指針的概念指針變量的定義與使用指針變量的運算知識點指針的案例分析案例分析指針相關(guān)練習(xí)題練習(xí)題9.1.1指針知識點程序在運行時,會為變量分配內(nèi)存空間。分配的內(nèi)存空間會有一個唯一的地址編號,在C語言中又叫做指針。通過指針可以找到該內(nèi)存單元。地址取值范圍:(32位系統(tǒng)為例)32位系統(tǒng)的內(nèi)存條,32個元件,232個組合=4*230,4GB內(nèi)存。內(nèi)存地址編號從0X00000000到0XFFFFFFFF(十六進(jìn)制表示)指針的概念指針變量保存某個內(nèi)存空間的地址,并對該內(nèi)存空間中的值進(jìn)行操作。指針變量的定義方式為:數(shù)據(jù)類型名*指針變量名;或者數(shù)據(jù)類型名*指針變量名=地址值;1.指針變量的定義與使用指針變量指向的變量的數(shù)據(jù)類型指針變量聲明符保存的是某個變量的地址int*pInt;//指向int型變量的指針char*pStr=NULL;//NULL為空指針,stdio.hint*pInt1,*pInt2;9.1.1指針知識點舉例:doublenum=3.14;double*pDouble=#//定義一個指向double型變量num的指針pDouble1.指針變量的定義與使用指針變量pDouble指向num示意圖&num3.14pDoublenum&取地址運算符,num的地址pDouble指向num9.1.1指針知識點指針變量占用的內(nèi)存大小,僅與地址信息的大小有關(guān),與類型無關(guān)。#include<stdio.h>intmain(){inta=100;charc='C';doubled=3.14;int*pInt=&a;char*pStr=&c;double*pDouble=&d;//分別輸出int指針、字符指針、浮點型指針占用的字節(jié)數(shù)printf("%d%d%d",sizeof(pInt),sizeof(pStr),sizeof(pDouble));return0;}1.指針變量的定義與使用運行結(jié)果(64位系統(tǒng),8個字節(jié))8889.1.1指針知識點(1)取內(nèi)容與取地址通過變量的地址/指針,同樣可以訪問到該變量的值。#include<stdio.h>intmain(void){ int*p,a=3; p=&a;
//兩種獲取變量a的方式,*p和a等價。 printf("*p的值為:%d,a的值為:%d\n",*p,a); *p=6;//通過指針p可以修改a的值 printf("*p的值為:%d,a的值為:%d\n",*p,a); return0;}2.指針變量的運算取內(nèi)容,*p:p指向的變量a的值,等價取地址,&a:a的地址運行結(jié)果:*p的值為:3,a的值為:3*p的值為:6,a的值為:6&a3
pa*p9.1.1指針知識點(2)賦值運算doublenum=3.14,value=0.618;double*pDouble1=&num,*pDouble2;//(a)pDouble1=&value;//(b)修改pDouble1的值,讓其指向value變量pDouble2=pDouble1;//(c)2.指針變量的運算(a)(b)(c)9.1.1指針知識點(3)加法、減法和比較運算指針變量還可以進(jìn)行加法、減法和比較運算,一般當(dāng)指針變量指向數(shù)組中的元素時,才有實際的含義。2.指針變量的運算9.1.1指針知識點指針變量只能與整數(shù)常量i進(jìn)行加減法運算,加或減同類型數(shù)據(jù)長度的i倍,指針往后或往前移動i個同類型的數(shù)據(jù)。指針pI的加減運算圖#include<stdio.h>intmain(){
inta=30,*p=&a,*pI=&a;
doubleb=3.14,*pD=&b;
charc='C',*pC=&c;
//前3個輸出語句,輸出各個類型占用的字節(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個輸出,先輸出各個指針的最初值
pI--;pD=pD-1;pC--;//第5個輸出,輸出-1后的值
printf("地址-1后,pI:%#X,pD:%#X,pC:%#X\n",pI,pD,pC);
pI+=2;pD+=2;pC+=2;//第6、7個輸出
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個輸出,比較p和pI指針
elseprintf("p和pI值不同。");
return0;}9.1.1指針知識點運行結(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)加法、減法和比較運算%#X是輸出以0X開頭的十六進(jìn)制地址。9.1.2指針案例分析案例9.1.1指針變量運算案例分析#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); //同類型的指針可以相互賦值,兩者指向同一個變量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處錯誤。輸入a和b,并定義指針p1和p2分別指向a和b,通過取指針值的方式計算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è)計一個對指針操作的程序,并分析程序運行的結(jié)果。9.1.3指針課堂練習(xí)題9.2指針與函數(shù)123指針變量作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)知識點指針與函數(shù)案例分析案例分析指針與函數(shù)相關(guān)練習(xí)題練習(xí)題指針變量作為函數(shù)的參數(shù)時:將函數(shù)外部某些變量的地址傳遞到函數(shù)內(nèi)部,在函數(shù)內(nèi)部通過這些外部變量的地址操作這些外部變量。1.指針變量作為函數(shù)的參數(shù)9.2.1指針與函數(shù)知識點案例9.2.1編寫calculate函數(shù)來計算兩個double類型變量a和b的和與差,并將和sum與差diff返回給main函數(shù)。9.2.1指針與函數(shù)知識點對于需要函數(shù)返回多個值的情況:可以將這兩個變量sum和diff定義為全局變量(案例8.2.1);還可以將這兩個變量作為函數(shù)的入?yún)?。參?shù)該如何傳遞?9.2.1指針與函數(shù)知識點#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("請輸入整型a和b的值:"); scanf("%d%d",&a,&b); calculate(sum,diff,a,b); printf("Inmain,sumis%d,diffis%d",sum,diff); return0;}請輸入整型a和b的值:2310↙Incalculate,sumis33,diffis13Inmain,sumis0,diffis0案例9.2.1程序代碼(錯誤實例)calculate()函數(shù)中計算出來sum和diff的值,這個結(jié)果并沒有返回給calculate()函數(shù)的調(diào)用者main()。分析原因(1)calculate與main中的sum和diff,不同變量,作用域不同、所占內(nèi)存空間不同。(2)sum、diff、a、b的值單向依次傳給了calculate()的形式參數(shù)。以值傳遞,傳遞的是數(shù)值。9.2.1指針與函數(shù)知識點#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("請輸入整型a和b的值:"); scanf("%d%d",&a,&b); calculate(&sum,&diff,a,b); printf("sumis%d,diffis%d",sum,diff); return0;}請輸入整型a和b的值:2310↙sumis33,diffis13案例9.2.1程序代碼(正確實例)main()函數(shù)將sum和diff的地址值傳給形參calculate中的pSum、pDiff;calculate中*pSum和*pDiff就是sum和diff。以值傳遞,傳遞的是地址信息。總結(jié),通過函數(shù)調(diào)用改變某個變量的值,需要滿足三個條件:①首先在主調(diào)函數(shù)中,傳入函數(shù)的實際參數(shù)需要是該變量地址;②其次函數(shù)的形參需要是與該變量同類型的指針;③最后在函數(shù)內(nèi)部,改變形參所指向的變量的值。用指針變量作為函數(shù)參數(shù)的方式,也可以實現(xiàn)函數(shù)返回多個變量的情況1.指針變量作為函數(shù)的參數(shù)9.2.1指針與函數(shù)知識點數(shù)組名實際上就是一個指針常量,主調(diào)函數(shù)將數(shù)組名傳遞給被調(diào)函數(shù)時,僅僅是數(shù)組的首地址,在被調(diào)函數(shù)中無法獲得數(shù)組元素的個數(shù),還需要一個整型參數(shù)來表示數(shù)組的元素個數(shù)。2.?dāng)?shù)組名作為函數(shù)的參數(shù)9.2.1指針與函數(shù)知識點要求:輸入兩個整數(shù)a,b,編寫swap函數(shù),通過調(diào)用swap函數(shù)實現(xiàn)a和b的交換。問題分析:如果希望通過函數(shù)調(diào)用改變a和b的值,需要滿足三個條件:①首先在主調(diào)函數(shù)中,傳入函數(shù)的實際參數(shù)需要是a和b的地址;②其次函數(shù)的形參需要是同類型的指針;③最后在函數(shù)內(nèi)部,改變形參所指向的變量的值。案例9.2.2定義函數(shù)交換兩個變量的值9.2.2指針與函數(shù)案例分析掃碼觀看視頻#include<stdio.h>voidswap(int*pA,int*pB){ inttmp; tmp=*pA; *pA=*pB; *pB=tmp;}intmain(){ inta,b; printf("請輸入整型a和b的值:"); scanf("%d%d",&a,&b); swap(&a,&b); printf("Afterswap,ais%d,bis%d",a,b); return0;}案例9.2.2
代碼請輸入整型a和b的值:2350↙afterswap,ais50,bis23ab2350pApB*pA*pBtmp2350239.2.2指針與函數(shù)案例分析案例9.2.3編寫冒泡排序函數(shù),對一個整型數(shù)組進(jìn)行排序,并編寫代碼驗證排序的正確性。9.2.2指針與函數(shù)案例分析冒泡排序動畫演示16216517590160將視頻中5口之家的身高,存到數(shù)組hhh[0]h[1]h[2]h[3]h[4]奶奶身高媽媽身高爸爸身高寶寶身高爺爺身高9.2.2指針與函數(shù)案例分析案例9.2.3冒泡排序函數(shù)冒泡排序的原理是:從前往后,依次比較相鄰元素大小,
若相鄰元素順序不符合要求,則交換兩個元素,
直到所有的元素都有序,排序結(jié)束。n個數(shù)據(jù),排序n-1輪。依據(jù)排序原理,冒泡排序類似水中冒泡,如果要求數(shù)據(jù)從小到大排序,較大的數(shù)慢慢冒出來,冒到數(shù)列的后面。如果從大到小排序,較小的數(shù)慢慢冒出來,冒到數(shù)列的后面。
16216517590160第1次比較:16216517590160第2次比較:162165
17590160第3次比較:162
16590175160第4次比較:162
165901601755個數(shù)第一輪比較比較4次
162
16590160175第1次比較:
162165
90160175第2次比較:
162
90165160175第3次比較:162
90
1601651755個數(shù)第二輪比較比較3次已有序已有序
162
90
160165175第1次比較:
90162
160165175第2次比較:901601621651755個數(shù)第三輪比較比較2次已有序
90160162165175第2次比較:90160
1621651755個數(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再來看一個實例,數(shù)組aaa[0]a[1]a[2]a[3]a[4]a[5]采用冒泡排序算法,打印出每輪排序后數(shù)據(jù)序列有沒有發(fā)現(xiàn)什么問題?如何對代碼進(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個數(shù),用選擇法將它們從小到大排序后輸出。
每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最?。ù螅┰兀缓蠓诺揭雅判蛐蛄械哪┪?。以此類推,直到全部待排序的數(shù)據(jù)元素排完。設(shè)n=5,輸入的5個數(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個數(shù)據(jù),排序4輪,n個數(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;}
針對n個元素的數(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中找出最小值對應(yīng)的下標(biāo)*//*將最小值與i位置交換*/如果從大到小排序select_sort該如何修改?運行結(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è)已有一個10個元素的整型數(shù)組a,且按值從小到大有序排列。輸入一個整數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的下標(biāo),否則,輸出“NotFound”。補充:二分法查找法
首先想到的是:順序查找算法,該算法簡單明了,其查找過程就是對數(shù)組元素從頭到尾的遍歷過程。但是,當(dāng)數(shù)組很大時,查找的效率不高。二分查找的效率較高,但前提是數(shù)組元素必須是有序的。二分法查找(流程圖)lowhighmidx<midx>midhighlowvoidbinary_search(inta[],intn,intx){intlow=0,high=n-1,mid;/*開始時查找區(qū)間為整個數(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運行下面的代碼,查看swap1函數(shù)是否可以交換a和b變量的值?并分析原因。#include<stdio.h>voidswap1(int*pA,int*pB){ int*tmp; tmp=pA; pA=pB; pB=tmp;}intmain(){ inta,b; printf("請輸入整型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ù),求兩個整數(shù)的和與差,可采用傳入和與差的指針的形式。輸入兩個整數(shù)a和b,編寫函數(shù)calc來計算a-b和a+b。課堂練習(xí)題9.2.3:編寫函數(shù),通過身份證號計算年齡。函數(shù)有兩個形式參數(shù):一個是存儲身份證號的字符數(shù)組,另一個為整型指針,指向的是保存年齡的變量。9.3指針與數(shù)組123采用指針訪問數(shù)組指針間的比較運算知識點指針與數(shù)組案例分析案例分析指針與數(shù)組相關(guān)練習(xí)題練習(xí)題9.3.1指針與數(shù)組知識點數(shù)組名:數(shù)組的首地址,第一個元素的地址。若數(shù)組array元素類型為Type,則array值就和&array[0]一致,array的類型為Type*類型的指針常量。系統(tǒng)在為數(shù)組分配一塊連續(xù)的內(nèi)存空間后,數(shù)組的首地址就已經(jīng)確定了,除非銷毀,不會改變,所以為指針常量。為什么數(shù)組名是一個指針常量?9.3.1指針與數(shù)組知識點舉例:int*p,array[5]={30,20,50,10,40};p=array;p的值為&array[0],*p為array[0]p+i表示相對于當(dāng)前指針p往后偏移i個整數(shù)的位置(1)采用指針訪問數(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ù)組知識點(1)采用指針訪問數(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的代碼及運行結(jié)果數(shù)組名可以作為指針來使用,指針變量可以作為數(shù)組形式來使用。9.3.1指針與數(shù)組知識點(1)采用指針訪問數(shù)組指針變量與數(shù)組名,兩者有什么區(qū)別呢?(1)p為指針變量,數(shù)組array是指針常量。p=array+i,array=array+i。(2)作為sizeof運算符的操作數(shù)時sizeof(array):為array所代表的整個數(shù)組占用的總字節(jié)數(shù)。sizeof(p):為p指針占用的字節(jié)數(shù)數(shù)組名不可以作為賦值=左邊的操作數(shù)。9.3.1指針與數(shù)組知識點(1)采用指針訪問數(shù)組舉例:intarray[5]={30,20,50,10,40},*p=array+2;p-1
是?p+2是?利用指針p,可以隨機(jī)從某一個元素開始往前往后訪問數(shù)組元素。array[2]前面一個元素,p-1為&array[1]p+2為&array[4]9.3.1指針與數(shù)組知識點(2)指針間的比較運算當(dāng)兩個指針均指向同一個數(shù)組中的元素時,兩個指針可以進(jìn)行兩類運算:
關(guān)系運算:
><≠相減的運算9.3.1指針與數(shù)組知識點(2)指針間的比較運算舉例:intarray[5]={30,20,50,10,40};int*p1=&array[3],*p2=array,*p;3020501040arrayp1p2①
以下式子成立:p1>p2、p2<p1、p1≠p2基于上面的比較運算,使用指針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ù)組知識點(2)指針間的比較運算舉例:3020501040arrayp1p2關(guān)系運算、相減運算結(jié)果備注p1>p2為真p1指向的數(shù)組元素的下標(biāo)大于p2指向的元素的下標(biāo),所以p1>p2為真p1<p2為假
p1==p2為假
p1-p23p1和p2之間相差3個存儲單元/3個元素指針間的比較運算表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);
}
//輸出元素的地址,每兩個一行
for(i=0;i<N;i++){
printf("%#X",(array+i));
if((i+1)%2==0&&i!=9)printf("\n");
}
printf("\n");
//三種通過p指針來獲取元素值的代碼
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;}運行結(jié)果:231045891357
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玫瑰花茶運營方案
- 我國公務(wù)員制度中存在的問題及對策論文提綱
- 房屋拆遷補償協(xié)議
- 電大行政管理《公共關(guān)系學(xué)》復(fù)習(xí)資料
- 審計實施方案
- 五天企業(yè)員工軍訓(xùn)策劃方案
- 現(xiàn)澆水磨石地面施工方案
- 窗簾專賣店管理全攻略
- 風(fēng)機(jī)降噪方案
- 公司財務(wù)管理制度范本
- 《光電技術(shù)》課件
- 中建直線加速器機(jī)房專項施工方案
- 第九套廣播體操評分細(xì)則及評分表
- 風(fēng)管工廠車間管理制度范本
- 幼兒園教師個人專業(yè)成長檔案
- GB/T 43107-2023核電站儀表引壓用不銹鋼無縫鋼管
- 濕度傳感器教案
- 落地式腳手架安全監(jiān)理實施細(xì)則
- NB/T 11108-2023選煤用起泡劑性能要求
- 高壓注射器基本操作程序教學(xué)文稿
- 軟磁材料課件
評論
0/150
提交評論