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

1、第五章第五章 指指 針針PointerPointer5.1 指針的基本概念指針的基本概念 指針是指針是C語(yǔ)言的重要特征,是語(yǔ)言的重要特征,是C語(yǔ)言訪問(wèn)內(nèi)存數(shù)據(jù)和程序的靈活語(yǔ)言訪問(wèn)內(nèi)存數(shù)據(jù)和程序的靈活和有效的手段。和有效的手段。 C C語(yǔ)言的指針支持:語(yǔ)言的指針支持: 函數(shù)的地址調(diào)用;函數(shù)的地址調(diào)用; 動(dòng)態(tài)分配內(nèi)存;動(dòng)態(tài)分配內(nèi)存; 數(shù)組的地址引用。數(shù)組的地址引用。內(nèi)存、地址、指針內(nèi)存、地址、指針 (Memory ,Address, Pointer)(Memory ,Address, Pointer) 內(nèi)存存放了計(jì)算機(jī)正在運(yùn)行的程序和程序正在使用的數(shù)據(jù)。內(nèi)內(nèi)存存放了計(jì)算機(jī)正在運(yùn)行的程序和程序正在使

2、用的數(shù)據(jù)。內(nèi)存的基本單元是字節(jié)存的基本單元是字節(jié)(Byte)。 為了訪問(wèn)內(nèi)存單元,為了訪問(wèn)內(nèi)存單元,CPU給每個(gè)內(nèi)存單元一個(gè)編號(hào),該編號(hào)稱(chēng)給每個(gè)內(nèi)存單元一個(gè)編號(hào),該編號(hào)稱(chēng)為該內(nèi)存單元的地址。為該內(nèi)存單元的地址。 變量是程序中可以改變的量,當(dāng)說(shuō)變量是程序中可以改變的量,當(dāng)說(shuō)明變量時(shí),系統(tǒng)將為其在內(nèi)存中開(kāi)辟相明變量時(shí),系統(tǒng)將為其在內(nèi)存中開(kāi)辟相應(yīng)得內(nèi)存單元。由此確定變量的地址及應(yīng)得內(nèi)存單元。由此確定變量的地址及內(nèi)存中的表示方式。內(nèi)存中的表示方式。2000H2019H2019H2019Hint a=0;a的的內(nèi)內(nèi)存存單單元元a的地址的地址&a 如果有一變量如果有一變量p,其內(nèi)容存放了,其內(nèi)容存

3、放了a的的地址地址&a,通過(guò),通過(guò)p也可實(shí)現(xiàn)對(duì)也可實(shí)現(xiàn)對(duì)a的訪問(wèn),的訪問(wèn),p稱(chēng)為指針,并指向稱(chēng)為指針,并指向a。00H20H00p指針的說(shuō)明指針的說(shuō)明 指針是特殊類(lèi)型的變量,其內(nèi)容是變量的地址。在使用前必須指針是特殊類(lèi)型的變量,其內(nèi)容是變量的地址。在使用前必須說(shuō)明,說(shuō)明某標(biāo)識(shí)符是指針類(lèi)型,并可指向某種類(lèi)型的對(duì)象。說(shuō)明,說(shuō)明某標(biāo)識(shí)符是指針類(lèi)型,并可指向某種類(lèi)型的對(duì)象。指針的說(shuō)明格式:指針的說(shuō)明格式: type *pname1,*pnamen;標(biāo)識(shí)符命名的指針變量名。標(biāo)識(shí)符命名的指針變量名。指針標(biāo)志。指針標(biāo)志。指針指向?qū)ο蟮念?lèi)型。指針指向?qū)ο蟮念?lèi)型。int *p, *q; /* p、q是指

4、向整型變量的指針。是指向整型變量的指針。*/float *pfValue ,*pf; /* pfValue和和pf是指向浮點(diǎn)型的指針。是指向浮點(diǎn)型的指針。*/指針對(duì)變量的引用指針對(duì)變量的引用 定義指針的目的是通過(guò)指針引用內(nèi)存對(duì)象,指針的引用應(yīng)按如定義指針的目的是通過(guò)指針引用內(nèi)存對(duì)象,指針的引用應(yīng)按如下步驟進(jìn)行:下步驟進(jìn)行:說(shuō)明指針說(shuō)明指針 int a=0, *p;指針指向?qū)ο笾羔樦赶驅(qū)ο髉=&a;通過(guò)指針引用對(duì)象通過(guò)指針引用對(duì)象*p=*p+2;4.指針操作的兩種運(yùn)算符:指針操作的兩種運(yùn)算符:取地址運(yùn)算取地址運(yùn)算 & &a表示取變量表示取變量a地址的運(yùn)算。地址的運(yùn)算。間接

5、運(yùn)算間接運(yùn)算 * *p表示取指針表示取指針p指向變量?jī)?nèi)容的運(yùn)算。指向變量?jī)?nèi)容的運(yùn)算。int a,*p; 2000Happ=&a; /* p指向指向a。 */2000H*p=2;2舉例:舉例:#include void main (void ) int x ,*p; x=55; p=&x; printf ( “ %d, %u ”, x, *p) ; *p=65; printf ( “ %d, %u”, x, *p) ;2000Hxp2000H5565關(guān)于指針的說(shuō)明:關(guān)于指針的說(shuō)明:指針必須指向?qū)ο蠛螅拍芤?。指針必須指向?qū)ο蠛?,才能引用?int *p; *p=2; /* Er

6、ror! */ &和和 * 為互補(bǔ)運(yùn)算。為互補(bǔ)運(yùn)算。int a,*p; p=&a;那么:那么:&*p p *&a a【例【例5-1】 /* example 5-1 指針訪問(wèn)簡(jiǎn)單變量示例 */ #include void main( void ) int a,b,*p1,*p2; p1 = &a; /* p1指向a */ p2 = &b; /* p2指向b */ scanf(%d%d, p1,&b); printf(a+b=%dn, *p1+*p2); 5。指針的運(yùn)算。指針的運(yùn)算 指針是特殊類(lèi)型的變量,其內(nèi)容是變量的地址,因此指針的運(yùn)指針是

7、特殊類(lèi)型的變量,其內(nèi)容是變量的地址,因此指針的運(yùn)算及結(jié)果一定要符合地址邏輯。算及結(jié)果一定要符合地址邏輯。五種算術(shù)運(yùn)算五種算術(shù)運(yùn)算int a, b, *p1, *p2;p1=&a;p2=&b;a2000Hb2400Hp1p22000H2400Hp1+; /*含義指向含義指向a后的整型單元后的整型單元*/2019H2019Hp1- -; /*指向指向a前的整型單元前的整型單元*/p1+n; /*指向指向a后的第后的第n個(gè)整型單元個(gè)整型單元*/p1- n; /*指向指向a前的第前的第n個(gè)整型單元個(gè)整型單元*/p2- p1; /*a和和b之間差的單元數(shù)之間差的單元數(shù)*/結(jié)果結(jié)果200H

8、p n 相當(dāng)于相當(dāng)于: p的實(shí)際內(nèi)容的實(shí)際內(nèi)容 nsizeof(*p);六種關(guān)系運(yùn)算六種關(guān)系運(yùn)算比較兩個(gè)同類(lèi)型變量之間的地址關(guān)系。比較兩個(gè)同類(lèi)型變量之間的地址關(guān)系。p1p2;指針賦值運(yùn)算#include void main(void) int a,b,*p1,*p2; a=2; b=3; p1=&a; p2=&b; *p1=*p2; printf(“%d,%dn”,a,b); a=3; b=5; p1=p2; printf(“%d,%d”,*p1,*p2);差別差別a&a 2000Hb&b 2400Hp1p2232000H2400H5.2 指針與數(shù)值型數(shù)組指針與

9、數(shù)值型數(shù)組 數(shù)組是同類(lèi)型的變量的集合,各元素按下標(biāo)的特定順序占據(jù)一數(shù)組是同類(lèi)型的變量的集合,各元素按下標(biāo)的特定順序占據(jù)一段連續(xù)的內(nèi)存,各元素的地址也連續(xù),指針對(duì)數(shù)組元素非常方便。段連續(xù)的內(nèi)存,各元素的地址也連續(xù),指針對(duì)數(shù)組元素非常方便。指針與一維數(shù)組指針與一維數(shù)組通過(guò)指針引用數(shù)組元素可以分以下三個(gè)步驟:通過(guò)指針引用數(shù)組元素可以分以下三個(gè)步驟:說(shuō)明指針和數(shù)組說(shuō)明指針和數(shù)組int *p,a10;指針指向數(shù)組指針指向數(shù)組p=a; /*指向數(shù)組的首地址指向數(shù)組的首地址*/p=&a0; /*指向數(shù)組的首地址指向數(shù)組的首地址*/通過(guò)指針引用數(shù)組元素通過(guò)指針引用數(shù)組元素當(dāng)指針指向數(shù)組的首地址時(shí),則下

10、標(biāo)為當(dāng)指針指向數(shù)組的首地址時(shí),則下標(biāo)為i的元素地址為:的元素地址為: p+i 或或a+i引用數(shù)組元素可以有三種方法:引用數(shù)組元素可以有三種方法:下標(biāo)法:下標(biāo)法: a i 指針?lè)ǎ褐羔樂(lè)ǎ?*(p+i)數(shù)組名法:數(shù)組名法:*(a+i)注意:數(shù)組名是地址常量,不能改變!注意:數(shù)組名是地址常量,不能改變! a=p; /*Error!*/ / /* * example 5-2 example 5-2 通過(guò)指針訪問(wèn)數(shù)組元素通過(guò)指針訪問(wèn)數(shù)組元素 * */ / #include #include void main(void) void main(void) double dArray10,dAvge, d

11、ouble dArray10,dAvge,* *dPointer;dPointer; int i; int i; dAvge = 0; dAvge = 0; dPointer = dArray; dPointer = dArray; / /* * 指針指向數(shù)組指針指向數(shù)組 * */ / for(i=0; i10; i+) for(i=0; i10; i+) scanf(%lf,dPointer + i); / scanf(%lf,dPointer + i); /* *dPointer+idPointer+i為下標(biāo)為為下標(biāo)為i i的元素地址的元素地址* */ / dAvge += dAvge +

12、= * *(dPointer + i); /(dPointer + i); /* * 累加各個(gè)元素的值累加各個(gè)元素的值 * */ / dAvge /= 10; dAvge /= 10; printf(The avgerage of array is: %lfn,dAvge); printf(The avgerage of array is: %lfn,dAvge); 【例【例5-2】有一個(gè)具有】有一個(gè)具有10個(gè)元素的雙精度數(shù)組,通過(guò)指針求其所個(gè)元素的雙精度數(shù)組,通過(guò)指針求其所有元素的平均值。有元素的平均值。/* example 5-3 通過(guò)指針求數(shù)組元素最大值及其位置通過(guò)指針求數(shù)組元素最大值及

13、其位置*/#include void main(void) int iArray10,*ipCur; /* ipCur遍歷訪問(wèn)數(shù)組的指針遍歷訪問(wèn)數(shù)組的指針 */ int *ipPos; /* ipPos最大元素地址最大元素地址*/ int i; ipCur = iArray; /*指針指向數(shù)組指針指向數(shù)組*/ for(i=0; i10; i+) scanf(%d, ipCur+); /* ipCur為下標(biāo)為為下標(biāo)為i的數(shù)組元素的地址的數(shù)組元素的地址 */ ipPos = iArray; /* 指向數(shù)組首地址指向數(shù)組首地址 */ /* 設(shè)下標(biāo)為設(shè)下標(biāo)為0的元素為最大值的元素為最大值 */ ipC

14、ur = iArray + 1; 【例【例5-3】通過(guò)指針求數(shù)組的最大值及其位置?!客ㄟ^(guò)指針求數(shù)組的最大值及其位置。 for(i=1; i *ipPos) ipPos = ipCur; /* ipPos保存最大元素的地址保存最大元素的地址*/ ipCur+; /*指向下一元素指向下一元素*/ printf(The max is %dn,*ipPos); printf(The position is %dn,ipPos-iArray);舉例:打印數(shù)組中的奇數(shù)。舉例:打印數(shù)組中的奇數(shù)。#include void main(void ) int i ,a 10 ; for (i=0 ; i10 ;

15、i+ ) scanf ( “ %d” , &ai ) ; for (i=0 ; i10 ; i+) if ( a i % 2 ) printf ( “ %d”, a i ); 數(shù)組元素法。數(shù)組元素法。循環(huán)輸入。循環(huán)輸入。循環(huán)判斷,滿足條件輸出。循環(huán)判斷,滿足條件輸出。數(shù)組名法。數(shù)組名法。 a+i *(a+i)指針?lè)?。指針?lè)ā?,*p ;p = a;p+*(p+i)結(jié)果是否結(jié)果是否正確?正確?p= a; *p=&a0;*注意指針在運(yùn)算時(shí)的變化。注意指針在運(yùn)算時(shí)的變化。2.指針與二維數(shù)組指針與二維數(shù)組如下說(shuō)明數(shù)組如下說(shuō)明數(shù)組int a34=1,2,3,4,5,6,7,8,9,10,

16、11,12;其二維結(jié)構(gòu)如下:其二維結(jié)構(gòu)如下:12345 6789101112行行列列為了便于索引,為了便于索引,C語(yǔ)言將數(shù)組分為兩級(jí)管理。語(yǔ)言將數(shù)組分為兩級(jí)管理。a0a1a2 將將a理解為一維數(shù)組,理解為一維數(shù)組, 數(shù)組有三個(gè)元素,它們分別為數(shù)組有三個(gè)元素,它們分別為a0、a1,a2 。各個(gè)元素又是一個(gè)有四個(gè)元素的一維數(shù)組。各個(gè)元素又是一個(gè)有四個(gè)元素的一維數(shù)組。從地址的角度看:從地址的角度看:a 為為a0 第一行的首地址第一行的首地址a+1 為為a1 第二行的首地址第二行的首地址a+2 為為a2 第三行的首地址第三行的首地址a+1 地址一次加一行。地址一次加一行。i行行j列數(shù)組元素的地址可以由

17、列數(shù)組元素的地址可以由a i +j得到。得到。數(shù)組名地址的兩級(jí)管理數(shù)組名地址的兩級(jí)管理aa0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23等價(jià)地址及其管理方式等價(jià)地址及其管理方式數(shù)組名是數(shù)組的地址,而且是常量,數(shù)組名是數(shù)組的地址,而且是常量,* 運(yùn)算不改變其值!運(yùn)算不改變其值!以下三種地址等價(jià):以下三種地址等價(jià):a+i*(a+i)a i 加法按行遞增加法按行遞增加法按列遞增加法按列遞增(a+1)+1*(a+1)+1差別?差別? 數(shù)組名表示數(shù)組元素?cái)?shù)組名表示數(shù)組元素a i j (*(a+i) j *(*(a+i)+j)*(a i +j)指針與二

18、維數(shù)組指針與二維數(shù)組int *p, a34;p=a;aij*(p+4*i+j)等價(jià)!等價(jià)!a00aa01a02a0a10a11a12a1a20a21a22a2a+1a1+2 /* example 5-4 求二維數(shù)組最小值及其位置 */ #include void main(void) int a34,i,j; int iMinRow,iMinCol; /*iMinRow最小值的行,iMinCol最小值的列 */ for(i=0; i3; i+) for(j=0; j4; j+) scanf(%d,ai + j);/* ai+j為i行j列元素的地址 */ iMinRow = 0; iMinCol

19、 = 0; /*假定a00為最小值*/ for(i=0; i3; i+) for(j=0; j4; j+) if(*(*(a + i) + j) aiMinRowiMinCol) iMinRow = i;iMinCol = j; /* 修正i和j為新的最小值下標(biāo) */ printf(The min is a%d%d=%dn, iMinRow,iMinCol,aiMinRowiMinCol); 【例【例5-4】輸入三行四列的整型數(shù)組,求最小值及其位置?!枯斎肴兴牧械恼蛿?shù)組,求最小值及其位置。 /* example 5-5 通過(guò)指針求二維數(shù)組元素的累加和 */ #include void ma

20、in(void) int i,j,a23,sum; int *p; p = (int *)a;/*p指向數(shù)組a,由于a加1加1行,轉(zhuǎn)換為整型指針*/ for(i=0; i2; i+) for(j=0; j3; j+) scanf(“%d”,ai + j); /* ai + j為i行j列元素的地址*/ sum = 0; for(i=0; i2; i+)for(j=0; j3; j+) sum += *(p + i*3 +j); /* 通過(guò)指針p表示aij */ printf(The sum of a = %dn,sum); 【例【例5-5】輸入兩行三列的整型數(shù)組,通過(guò)指針求所有元素的累加和?!枯?/p>

21、入兩行三列的整型數(shù)組,通過(guò)指針求所有元素的累加和。舉例:舉例: 在數(shù)組在數(shù)組a中查找輸入的數(shù),輸出行列位置。中查找輸入的數(shù),輸出行列位置。#include void main (void ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i, j,iS; int *p; p=a; scanf (“ %d” , &iS) ; for(i=0;i3;i+)for(j=0;j4;j+) if(iS= a i j ) printf(“iS equal to a%d %d n”,i , j); 下標(biāo)法。下標(biāo)法。*(a i +j)*(*(a+i)+j)*(p+4*

22、i+j)【例【例5-6】輸入】輸入3行行4列的浮點(diǎn)型數(shù)組,通過(guò)指針求數(shù)組的平均值。列的浮點(diǎn)型數(shù)組,通過(guò)指針求數(shù)組的平均值。/* example 5-6 通過(guò)指針求二維數(shù)組的平均值通過(guò)指針求二維數(shù)組的平均值 */#include void main(void) int i,j; float a34,fAvg; float (*p)4; p = a; /*指針指向數(shù)組指針指向數(shù)組*/ fAvg = 0; for(i=0; i3; i+) for(j=0; j4; j+) scanf(“%f”,pi+j); /* pi + j為為i行行j列元素的地址列元素的地址*/ fAvg += pij; /*

23、pij表示表示aij*/ fAvg /=12; printf(The average of a = %fn,fAvg);5.3 指針與字符串字符數(shù)組)指針與字符串字符數(shù)組)字符串在內(nèi)存中可以存儲(chǔ)為兩種形式:字符串在內(nèi)存中可以存儲(chǔ)為兩種形式:字符數(shù)組字符數(shù)組字符串常量字符串常量 可以使指針指向字符數(shù)組或字符串常量,通過(guò)指針引用字符數(shù)可以使指針指向字符數(shù)組或字符串常量,通過(guò)指針引用字符數(shù)組或字符串的各個(gè)字符。組或字符串的各個(gè)字符。1.指針與字符數(shù)組:指針與字符數(shù)組:char *chp,str =”Hello!”; /*說(shuō)明字符指針和字符數(shù)組說(shuō)明字符指針和字符數(shù)組*/chp=str; /*指針指向字

24、符數(shù)組指針指向字符數(shù)組*/putchar( *(chp+2); /*通過(guò)指針引用數(shù)組元素通過(guò)指針引用數(shù)組元素*/2.指針與字符串:指針與字符串:char *strp; /*說(shuō)明字符指針說(shuō)明字符指針*/strp=“Hello!”; /*指針指向字符串指針指向字符串*/puts(strp); /*通過(guò)指針引用字符串通過(guò)指針引用字符串*/說(shuō)明指針時(shí),可以同時(shí)賦初值,如:說(shuō)明指針時(shí),可以同時(shí)賦初值,如:char *strp=“Hello!”;賦值表示將字符串的地址賦給指針!賦值表示將字符串的地址賦給指針! /* example 5-7 通過(guò)指針訪問(wèn)字符串常量 */ #include void main

25、(void) char *p;/* 說(shuō)明指向字符的指針p */ int iNumOfi; p = “This is a test string”; /* 指針指向字符串常量 */ iNumOfi = 0; while(*p!=0) if(*p = i) iNumOfi+; p+; printf(In the string the number of i = %dn,iNumOfi); 【例【例5-7】統(tǒng)計(jì)字符串常量中的小寫(xiě)字母】統(tǒng)計(jì)字符串常量中的小寫(xiě)字母i的數(shù)量。的數(shù)量。/* example 5-8 通過(guò)指針訪問(wèn)字符數(shù)組通過(guò)指針訪問(wèn)字符數(shù)組 */#include void main(void)

26、 char str80, *chp; /* 說(shuō)明字符數(shù)組及指向字符的指針說(shuō)明字符數(shù)組及指向字符的指針 */ chp = str; /* 指針指向字符數(shù)組指針指向字符數(shù)組 */ gets(chp); while(*chp != 0) if(*chp = a & *chp = z) *chp -= 32;chp+; /* 指針指向下一字符指針指向下一字符 */ puts(str); 【例【例5-8】輸入字符串,將其中小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字符,其余的】輸入字符串,將其中小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字符,其余的字符不變,輸出結(jié)果。字符不變,輸出結(jié)果。舉例:將字符串中的大寫(xiě)字母轉(zhuǎn)化對(duì)應(yīng)的小寫(xiě)字母。舉例:將字

27、符串中的大寫(xiě)字母轉(zhuǎn)化對(duì)應(yīng)的小寫(xiě)字母。#include void main(void) char *p,s80; p=s; gets(p); for(;*p!=0;p+) if(*p=A&*p=Z) *p+=32; p=s; puts(p); 舉例:將無(wú)符號(hào)的八進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)。舉例:將無(wú)符號(hào)的八進(jìn)制字符串轉(zhuǎn)換為十進(jìn)制整數(shù)。#include void main(void) char *p,s6; int i,n=0; p=s; gets(p); for(;*p!=0;p+) n=n*8+*p-0; printf(“%dn”,n); p指向指向s數(shù)組。數(shù)組。輸入字符串。輸入字符串

28、。sps5560n=0*8+5-05n=5*8+5-045n=45*8+6-0366思考題:將思考題:將4位十六進(jìn)值字符串轉(zhuǎn)化為十進(jìn)制字符串。位十六進(jìn)值字符串轉(zhuǎn)化為十進(jìn)制字符串。5.4 指指 針針 數(shù)數(shù) 組和指向指針的指針組和指向指針的指針 指針是存放其它數(shù)據(jù)對(duì)象地址的變量。因而,指針可以構(gòu)成數(shù)指針是存放其它數(shù)據(jù)對(duì)象地址的變量。因而,指針可以構(gòu)成數(shù)組。每個(gè)數(shù)組元素為一個(gè)指針變量,且在內(nèi)存中連續(xù)存放。組。每個(gè)數(shù)組元素為一個(gè)指針變量,且在內(nèi)存中連續(xù)存放。指針數(shù)組的說(shuō)明指針數(shù)組的說(shuō)明說(shuō)明格式:說(shuō)明格式: type *數(shù)組名數(shù)組名const exp;int *p 4 ;含義是在內(nèi)存中開(kāi)辟空間,并指明元

29、素所指向的對(duì)象的類(lèi)型。含義是在內(nèi)存中開(kāi)辟空間,并指明元素所指向的對(duì)象的類(lèi)型。p 0 p 1 p 2 p 3 數(shù)組名數(shù)組名p為數(shù)組的地址。為數(shù)組的地址。使用前必須讓各元素指向?qū)ο?。使用前必須讓各元素指向?qū)ο?。int i, a34, *p3;for(i=0;i3;i+) p i =a i ;*(p2+1)=2; /*通過(guò)指針數(shù)組引用數(shù)組元素通過(guò)指針數(shù)組引用數(shù)組元素a21*/ /* example 5-9 通過(guò)指針數(shù)組訪問(wèn)二維數(shù)組通過(guò)指針數(shù)組訪問(wèn)二維數(shù)組 */ #include void main(void) int a34; int *p3; /* 說(shuō)明行數(shù)相同的指針數(shù)組說(shuō)明行數(shù)相同的指針數(shù)組 *

30、/ int i,j; int iSumOfPosi,iCountOfPosi; for(i=0; i3; i+) pi = ai; /* 指針數(shù)組元素指向?qū)?yīng)的行指針數(shù)組元素指向?qū)?yīng)的行 */ for(j=0; j4; j+) scanf(%d,pi + j); iSumOfPosi = 0; iCountOfPosi =0;【例【例5-9】統(tǒng)計(jì)】統(tǒng)計(jì)3行行4列整型二維數(shù)組中正數(shù)的個(gè)數(shù),并求正數(shù)的累列整型二維數(shù)組中正數(shù)的個(gè)數(shù),并求正數(shù)的累加和,輸出結(jié)果。加和,輸出結(jié)果。 for(i=0; i3; i+) for(j=0; j 0) iSumOfPosi += *(pi+j); /* 通過(guò)指針數(shù)

31、組訪問(wèn)二維通過(guò)指針數(shù)組訪問(wèn)二維數(shù)組數(shù)組 */ iCountOfPosi+; printf(The sum of posi-numb in array is %dn,iSumOfPosi); printf(The number of posi-numb in array is %dn,iCountOfPosi); 指針數(shù)組的應(yīng)用舉例指針數(shù)組的應(yīng)用舉例指針數(shù)組與多維數(shù)組指針數(shù)組與多維數(shù)組 通過(guò)指針數(shù)組按數(shù)學(xué)方式輸出數(shù)組的值。通過(guò)指針數(shù)組按數(shù)學(xué)方式輸出數(shù)組的值。#include void main ( ) int i , j; int a34= 1,2,3,4, 5,6,7,8, 9,10,11,1

32、2 ; int *p3; p0 = a0; p1 = a1 ; p2 = a2; for (i=0 ; i3 ; i+) for (j=0; j4; j+) printf (“ %5d” , *(pi+j); printf ( “n” ) ; 123456789 101112 p0數(shù)組數(shù)組a的二維結(jié)構(gòu)的二維結(jié)構(gòu)p1p2a0a1a2每輸出一行,打印回車(chē)。每輸出一行,打印回車(chē)。 /* example 5-10 通過(guò)指針數(shù)組訪問(wèn)二維字符數(shù)組通過(guò)指針數(shù)組訪問(wèn)二維字符數(shù)組 */ #include #include void main(void) char strName510,*strP5,*strTe

33、mp = NULL; int i,j; for(i=0; i5; i+) strPi = strNamei;/* 指針數(shù)組的各個(gè)元素指向字符數(shù)組的指針數(shù)組的各個(gè)元素指向字符數(shù)組的對(duì)應(yīng)行對(duì)應(yīng)行 */ gets(strPi); for(i=0; i4; i+) for(j=i+1; j 0) /* 比較比較 */ 【例【例5-10】對(duì)存放于二維字符數(shù)組中的五個(gè)字符串按由小到大排序】對(duì)存放于二維字符數(shù)組中的五個(gè)字符串按由小到大排序輸出。輸出。 strTemp = strPi; strPi = strPj; strPj = strTemp; printf(The result after sort:n

34、); for(i=0; i5; i+) puts(strPi); /* 輸出輸出 */ 指針數(shù)組與多字符串指針數(shù)組與多字符串通過(guò)指針數(shù)組構(gòu)成的菜單,執(zhí)行通過(guò)指針數(shù)組構(gòu)成的菜單,執(zhí)行DOS命令。命令。#include void main(void )char *command = “dir”, “time”, “date”, ch ; for ( ; ; ) do printf (“1: directoryn”) ; printf (“2:set timen” ) ; printf (“3:set daten”) ; printf (“4:quitn”) ; printf (nselection

35、:”) ; ch =getchar( ) ; printf (“n”) ; while (ch4) ; if (ch=4) break; system (commandch-1) ; 內(nèi)層循環(huán)輸入選項(xiàng)內(nèi)層循環(huán)輸入選項(xiàng)外層循環(huán)根據(jù)選項(xiàng)執(zhí)行命令外層循環(huán)根據(jù)選項(xiàng)執(zhí)行命令執(zhí)行系統(tǒng)命令函數(shù),如執(zhí)行系統(tǒng)命令函數(shù),如:system(“dir”);dir0time0date0command0command1command23-1 2【例【例5-11】輸入】輸入0到到6的數(shù)字分別代表周日到周六,輸出英文名稱(chēng)。的數(shù)字分別代表周日到周六,輸出英文名稱(chēng)。/* example 5-11 字符型指針數(shù)組與字符串常量字符型

36、指針數(shù)組與字符串常量 */#include void main(void) char *strDay7 = “Sunday”,“Monday”,“Tuesday”,Wednesday, Thursday,Friday,Saturday; int iDay; scanf(%d,&iDay); if(iDay = 0 & iDay = 6) puts(strDayiDay); else puts(Input error!); 指向指針的指針指向指針的指針 如果指針變量的內(nèi)容存放其它指針的地址,稱(chēng)該指針為指向指如果指針變量的內(nèi)容存放其它指針的地址,稱(chēng)該指針為指向指針的指針。針的指針。

37、 指向指針的指針的說(shuō)明:指向指針的指針的說(shuō)明:形式:形式: type *p;int *p;p是一個(gè)指向整形指針的指針。是一個(gè)指向整形指針的指針。#include void main ( void) int x, *p, *q ; x=10; p=&x; q=&p; printf (“%d” , * *q) ; p為指向整型的指針。為指向整型的指針。q為指向整型指針的指針。為指向整型指針的指針。xpq2000H3000H102000H3000H指向指針的指針的應(yīng)用指向指針的指針的應(yīng)用指向指針的指針一般用于多維數(shù)組和指針數(shù)組的操作。指向指針的指針一般用于多維數(shù)組和指針數(shù)組的操作。多

38、維數(shù)組多維數(shù)組#include void main ( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12, ; int *arr3 = a0 , a1 , a2 ; int i ,j, *p ; p=arr ; for (i=0 ;i3; i+) for (j=0 ; i4 ; j+) printf(“%5d” , *( *(p+i)+ j ) ) ; printf (“n”) ;aiaij123456789101112a0a1a2arrarrpp+1【例【例5-12】指向指針的指針的簡(jiǎn)單應(yīng)用?!恐赶蛑羔樀闹羔樀暮?jiǎn)單應(yīng)用。/* example 5-12 通過(guò)指向指針的指

39、針訪問(wèn)簡(jiǎn)單變量示例通過(guò)指向指針的指針訪問(wèn)簡(jiǎn)單變量示例 */#include void main(void) int x,*p,*q; /* 說(shuō)明變量、指針、指向指針的指針說(shuō)明變量、指針、指向指針的指針 */ x = 20; p = &x; /* 指針指向變量指針指向變量 */ q = &p; /* 指向指針的指針指向指針指向指針的指針指向指針 */ printf(“x=%dn”,*q); /* 引用指向的對(duì)象引用指向的對(duì)象 */ /* example 5-13 通過(guò)指向指針的指針與指針數(shù)組訪問(wèn)二維數(shù)組通過(guò)指向指針的指針與指針數(shù)組訪問(wèn)二維數(shù)組 */ #include void m

40、ain(void) int a34,*p3,*pp; /* 說(shuō)明二維數(shù)組及與其行數(shù)相同的指針數(shù)組說(shuō)明二維數(shù)組及與其行數(shù)相同的指針數(shù)組 */ int i,j; float iAvg; for(i=0; i3; i+) pi = ai; /* 指針數(shù)組元素指向?qū)?yīng)的行指針數(shù)組元素指向?qū)?yīng)的行 */ for(j=0; j4; j+) scanf(%d,pi + j); pp = p; /* pp指向指針數(shù)組指向指針數(shù)組 */ iAvg = 0; for(i=0; i3; i+) for(j=0; j4; j+) iAvg += *(*(pp + i) +j); /* 通過(guò)通過(guò)pp訪問(wèn)訪問(wèn)aij */

41、 printf(The average of a is %fn,iAvg/12); 【例【例5-13】通過(guò)指向指針的指針與指針數(shù)組,求二維數(shù)組的平均值?!客ㄟ^(guò)指向指針的指針與指針數(shù)組,求二維數(shù)組的平均值。用于處理多字符串用于處理多字符串#include void main (void) char *name = “one” , “two” , “three” , “four” ; char *p ; int i ; for ( i=0 ; i4 ; i+) p=name+i ; printf (“%sn”, *p) ; name0name1name2name3pname+ione0two0three0four0指針的類(lèi)型問(wèn)題指針的類(lèi)型問(wèn)題 通過(guò)指針可以訪問(wèn)基本類(lèi)型的變量及數(shù)組,指針的類(lèi)型是其指通過(guò)指針可以訪問(wèn)基本類(lèi)型的變量及數(shù)組,指針的類(lèi)型是其指向數(shù)據(jù)的類(lèi)型,該類(lèi)型決定了指針邏輯加一時(shí)所加的物理字節(jié)數(shù)。向數(shù)據(jù)的類(lèi)型,該類(lèi)型決定了指針邏輯加一時(shí)所加的物理字節(jié)數(shù)??梢詮?qiáng)制轉(zhuǎn)換指針的類(lèi)型,轉(zhuǎn)換方式為:可以強(qiáng)制轉(zhuǎn)換指針的類(lèi)型,轉(zhuǎn)換方式為:(type *) p#include void main( ) char a3, *p ; int y; a0=0

溫馨提示

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