版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計第6章指針第1章C語言概述第2章基本數(shù)據(jù)類型和運算第3章結構化程序設計第5章函數(shù)第6章指針第7章復合結構類型第8章編譯預處理第4章數(shù)組及字符串●課程概述
附錄6.1指針的基本概念 6.2指針變量的運算6.3指向數(shù)組元素的指針6.4指向多維數(shù)組的指針變量6.5指向字符串的指針變量6.6?指針型函數(shù)6.7?指針數(shù)組6.8?二級指針6.9
程序舉例6.10
用指針進行內存動態(tài)分配6.11
指針數(shù)據(jù)類型的總結
第9章位運算第10章文件指針第6章教學目標?掌握指針的概念和運算規(guī)則?掌握用指針訪問變量、一維數(shù)組和二維數(shù)組?用指針處理字符串的方法6.1.1指針和指針變量6.1指針的基本概念1.指針的概念
2.指針變量內存單元的編號叫做地址,通常也把這個地址稱為“指針”。6.1.1指針和指針變量6.1指針的基本概念1.指針的概念
2.指針變量在C語言中,允許用一個變量來存放指針,這種變量稱為“指針變量”。6.1.2指針變量的定義1.定義的一般格式
2.舉例說明6.1指針的基本概念[存儲類型]類型說明符*變量名;其中,“*”表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型。一個指針變量只能指向同一種類型的變量,也就是說,不能定義一個既指向一個整型變量又指向一個雙精度型變量的指針變量。6.1.2指針變量的定義1.定義的一般格式
2.舉例說明6.1指針的基本概念例如:int*m1;表示m1是一個指針變量,它的值是某個整型變量的地址;或者說m1指向一個整型變量。至于m1究竟指向哪一個整型變量,應該由指向m1賦予的地址來決定。再例如:staticint*m2;/*m2是指向靜態(tài)整型變量的指針變量*/float*m3;/*m3是指向浮點型變量的指針變量*/char*m4;/*m4是指向字符型變量的指針變量*/6.1.3指針變量賦值1.變量地址表示方法
2.給指針變量賦地址的方法C語言提供了地址運算符“&”,表示變量地址的一般形式為:&變量名;如:&a表示變量a的地址,&b表示變量b的地址。6.1指針的基本概念3.例6.16.1.3指針變量賦值1.變量地址表示方法
(1)指針變量初始化的方法。inta;/*定義整型變量a*/int*p=&a;/*定義指針p,并將變量a的地址賦給指針p*/(2)賦值語句的方法。inta;/*定義整型變量a*/int*p;/*定義指針p*/p=&a;/*將變量a的地址賦給指針p*/6.1指針的基本概念2.給指針變量賦地址的方法3.例6.16.1.3指針變量賦值1.變量地址表示方法
【例6.1】用指針變量訪問變量中的數(shù)據(jù)。#include<stdio.h>main(){ inta,*p;/*定義整型變量a和整型變量指針p*/ p=&a;/*指針p指向變量a*/
printf("pleaseenteranumber:\n",*p);
scanf("%d",p);/*為指針p所指的存儲單元輸入數(shù)值*/
printf("%d\n",*p);/*輸出指針p所指的存儲單元的內容*/}6.1指針的基本概念2.給指針變量賦地址的方法3.例6.11501000ap1000
10012000
20012.取內容運算符*3.注意事項取地址運算符“&”是單目運算符,其結合性為自右至左,功能是取變量的地址。在scanf函數(shù)中,我們已經(jīng)認識并使用了&運算符。1.取地址運算符&6.2.1指針運算符6.2指針變量的運算2.取內容運算符*3.注意事項取內容運算符“*”是單目運算符,其結合性為自右至左,通過“*”可以存取指針所指的存儲單元的內容。在“*”運算符之后跟的變量必須是指針變量。需要注意的是指針運算符“*”和指針變量說明中的指針說明符“*”不是一回事。在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達式中出現(xiàn)的“*”則是一個運算符,用以表示指針變量所指的內容。1.取地址運算符&6.2.1指針運算符6.2指針變量的運算2.取內容運算符*3.注意事項【例6.2】分析下面程序的運行結果。#include<stdio.h>main(){ int
d,x,*p;/*定義整型變量d、x和整型指針p*/ d=10; x=19; p=&x;/*將變量x的地址賦給指針p*/
printf("d=%d\n",*p);}1.取地址運算符&6.2.1指針運算符6.2指針變量的運算程序的運行結果如下:d=192.取內容運算符*3.注意事項(1)取地址運算符&表示變量的地址;而取內容運算符*表示指針所指的內容。(2)運算符&只能用于變量和數(shù)組元素。(3)*和&都是單目運算符,兩者的優(yōu)先級相同,結合性均是從右到左。(4)&x不能出現(xiàn)在賦值號的左邊。(5),因此不能用&取寄存器變量的地址。(6)被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a也是錯誤的。1.取地址運算符&6.2.1指針運算符6.2指針變量的運算2.取內容運算符*3.注意事項【例6.3】通過指針變量訪問字符型變量。#include<stdio.h>main(){charch1,ch2;/*定義字符型變量ch1和ch2*/char*p1,*p2;/*定義字符型指針p1和p2*/ch1='A';ch2='B';p1=&ch1;/*指針p1指向變量ch1*/p2=&ch2;/*指針p2指向變量ch2*/printf("%c,%c\n",ch1,ch2);/*輸出變量ch1和變量ch2的內容*/
printf("%c,%c",*p1,*p2);/*輸出指針p1和p2所指的存儲單元的內容*/}1.取地址運算符&6.2.1指針運算符6.2指針變量的運算程序的運行結果為:A,BA,B&ch1&ch2P1P2ch1ch2(a)p1與ch1之間的關系(b)p2與ch2之間的關系2.指針中加減運算3.指針變量的關系運算(1)指針變量初始化賦值時,不要將一個內存地址常量賦給一指針變量。例如:inti=100,x;int*m;:m=&i;1.賦值運算6.2.2指針變量的運算6.2指針變量的運算4.兩指針變量相減2.指針中加減運算3.指針變量的關系運算(2)指針變量和一般變量一樣,存放在其中的值是可以改變的,也就是說可以改變指針變量的指向,例如:inti,j;int*p1;int*p2;i='c';j='d';p1=&i;p2=&j;上面的程序語句也可以用下面的圖來說明。1.賦值運算6.2.2指針變量的運算6.2指針變量的運算賦值運算結果4.兩指針變量相減2.指針中加減運算3.指針變量的關系運算如果此時有如下的賦值表達式:p2=p1;則指針變量p2與p1就指向了同一個對象i,此時的*p2就等價于i,而不再是j了,這種情況可以用如下的圖來說明。1.賦值運算6.2.2指針變量的運算6.2指針變量的運算p2=p1時的情形P1P24.兩指針變量相減2.指針中加減運算3.指針變量的關系運算再例如,如果執(zhí)行如下的表達式:*p2=*p1;則此時表示把p1指向的內容賦給p2所指的區(qū)域,此時可用下圖來表示情形。1.賦值運算6.2.2指針變量的運算6.2指針變量的運算*p2=*p1時的情形P1P24.兩指針變量相減2.指針中加減運算3.指針變量的關系運算(3)如果需要,也可以把數(shù)組的首地址賦予指向數(shù)組的指針變量。例如:inta[8],*pa;pa=a;也可寫為:pa=&a[0];也可采取如下初始化賦值的方法:inta[8],*pa=a;1.賦值運算6.2.2指針變量的運算6.2指針變量的運算4.兩指針變量相減2.指針中加減運算3.指針變量的關系運算(4)可以把字符串的首地址賦給指向字符類型的指針變量。例如,把字符串“Hellohuman”賦給指針變量p,方法如下:char*p;p="Hellohuman";或用初始化賦值的方法寫為:char*p="Hellohuman";1.賦值運算6.2.2指針變量的運算6.2指針變量的運算4.兩指針變量相減2.指針中加減運算3.指針變量的關系運算對于指向數(shù)組的指針變量,可以給其加上或減去一個整數(shù)n。例如,設p是指向數(shù)組m的指針變量,則p+n,p-n,p++,++p,p--,--p都是合法的運算表達式。給指針變量加上或減去一個整數(shù)n表示把指針指向的當前位置(指向某數(shù)組元素)向前或向后移動n個位置。1.賦值運算6.2.2指針變量的運算6.2指針變量的運算4.兩指針變量相減2.指針中加減運算3.指針變量的關系運算指向同一數(shù)組的兩個指針變量進行關系運算可表示它們所指數(shù)組元素之間的關系。例如:p1==p2;/*表示p1和p2指向同一數(shù)組元素*/p1>p2;/*表示p1處于高地址位置*/p1<p2;/*表示p2處于高地址位置*/1.賦值運算6.2.2指針變量的運算6.2指針變量的運算4.兩指針變量相減2.指針中加減運算3.指針變量的關系運算4.兩指針變量相減【例6.4】一個關于指針變量關系運算的例子。main(){ int
x,y,z,*max,*min; printf("pleaseinputthreenumbers:\n");
scanf("%d,%d,%d",&x,&y,&z); if(x>y)/*三個數(shù)進行大小比較*/ {max=&x;min=&y;}
else{max=&y;min=&x;}
if(z>*max)max=&z;
if(z<*min)min=&z;
printf("themaxis:%d\ntheminis:%d\n",*max,*min);}1.賦值運算6.2.2指針變量的運算6.2指針變量的運算該程序的運行結果如下:pleaseinputthreenumbers:233465↙themaxis:65theminis:232.指針中加減運算4.兩指針變量相減兩指針變量也可以進行相減運算,其所得之差是:兩個指針所指的數(shù)組元素之間相差的元素個數(shù),實際上是兩個指針值(地址)相減之差再除以該數(shù)組元素的長度(字節(jié)數(shù))。例如:p1和p2是指向同一整型數(shù)組的兩個指針變量,設p1的值為1100H,p2的值為1050H,由于整型數(shù)組每個元素占2個字節(jié),所以p1-p2的結果為(1100H-1050H)/2=25,因此“p1-p2”表示p1和p2之間相差25個元素。但是,p1和p2不能進行加法運算,因為指針變量相加是毫無意義的。1.賦值運算6.2.2指針變量的運算6.2指針變量的運算3.指針變量的關系運算2.數(shù)組指針變量的說明3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)第一,一個數(shù)組是由連續(xù)的一塊內存單元組成的。其中的數(shù)組名就是這塊連續(xù)內存單元的首地址。第二,一個數(shù)組也是由各個數(shù)組元素組成的。第三,數(shù)組元素的首地址也是指它所占有的幾個內存單元的首地址。1.幾個數(shù)組指針變量的關系6.3指向數(shù)組元素的指針2.數(shù)組指針變量的說明3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)數(shù)組指針變量說明的一般形式為:類型說明符*指針變量名;其中,“類型說明符”表示指針變量所指數(shù)組的類型;“*”表示其后的變量是指針變量。用數(shù)組指針變量訪問數(shù)組元素有兩種方法:第一種方法為下標法,即用m[i]形式訪問數(shù)組元素。第二種方法為指針法,即采用*(pm+i)形式,該方法是用間接訪問的方法來訪問數(shù)組元素。1.幾個數(shù)組指針變量的關系6.3指向數(shù)組元素的指針2.數(shù)組指針變量的說明3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)【例6.6】采用指針法訪問數(shù)組元素。#include<stdio.h>main(){ intm[5],i,*pm; pm=m;
for(i=0;i<5;i++) {*pm=i;pm++;} pm=m;
for(i=0;i<5;i++) {printf("m[%d]=%d\n",i,*pm); pm++;}}1.幾個數(shù)組指針變量的關系6.3指向數(shù)組元素的指針該程序的運行結果如下:m[0]=0m[1]=1m[2]=2m[3]=3m[4]=42.數(shù)組指針變量的說明3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)【例6.7】與例6.6的本意相同,但是其實現(xiàn)方式不同。#include<stdio.h>main(){
intm[5],i,*pm=m;
for(i=0;i<5;){*pm=i;
printf("m[%d]=%d\n",i++,*pm++);
}}1.幾個數(shù)組指針變量的關系6.3指向數(shù)組元素的指針該程序的運行結果如下:m[0]=0m[1]=1m[2]=2m[3]=3m[4]=42.數(shù)組指針變量的說明3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)數(shù)組名是數(shù)組的首地址,實參向形參傳送數(shù)組名實際上就是傳送數(shù)組的地址,形參得到該地址后也指向同一數(shù)組。指針變量的值也是地址,數(shù)組指針變量的值即為數(shù)組的首地址,也可作為函數(shù)的參數(shù)使用。1.幾個數(shù)組指針變量的關系6.3指向數(shù)組元素的指針2.數(shù)組指針變量的說明3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)【例6.8】編寫求五門課程平均成績的函數(shù),并編寫主函數(shù)調用該函數(shù)。下圖所示為對應的N-S流程圖。1.幾個數(shù)組指針變量的關系6.3指向數(shù)組元素的指針定義浮點型的數(shù)組sco[5]、變量av
和指針*spsp=scofor(i=0;i<5;i++)將5門課程的成績依次輸入到sco[i]中av=aver(sp)輸出平均分av的值main函數(shù)的N-S流程圖定義浮點型變量av和sfor(i=0;i<5;i++)s=s+*pm++av=s/5返回av的值aver函數(shù)的N-S流程圖2.數(shù)組指針變量的說明3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)程序代碼如下:#include<stdio.h>floataver(float*pm);main(){
floatsco[5],av,*sp;
inti;
sp=sco;
printf("\npleaseinput5scores:\n");
for(i=0;i<5;i++)scanf("%f",&sco[i]);
av=aver(sp);
printf("averagescoreis%5.2f",av);
}floataver(float*pm)/*函數(shù)aver*/{
inti;
floatav,s=0;
for(i=0;i<5;i++)s=s+*pm++;
av=s/5;returnav;}1.幾個數(shù)組指針變量的關系6.3指向數(shù)組元素的指針程序的運行結果如下:pleaseinput5scores:90455680100↙averagescoreis74.206.4指向二維數(shù)組的指針變量1.二維數(shù)組地址的表示方法
2.二維數(shù)組的指針變量C語言允許把一個二維數(shù)組分解為多個一維數(shù)組來處理。因此二維數(shù)組m可分解為三個一維數(shù)組,即m[0]、m[1]、m[2]。每個一維數(shù)組又含有四個元素。例如m[0]數(shù)組,含有m[0][0]、m[0][1]、m[0][2]、m[0][3]四個元素。6.4指向二維數(shù)組的指針變量1.二維數(shù)組地址的表示方法
2.二維數(shù)組的指針變量【例6.9】用不同的方式輸出同一數(shù)組元素的數(shù)據(jù)值的應用舉例。#include<stdio.h>main(){intm[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
printf("%d,%d,%d,%d,%d,\n",m,*m,m[0],&m[0],&m[0][0]);printf("%d,%d,%d,%d,%d,\n",m+1,*(m+1),m[1],&m[1],&m[1][0]);printf("%d,%d,%d,%d,%d,\n",m+2,*(m+2),m[2],&m[2],&m[2][0]);printf("%d,%d\n",m[1]+1,*(m+1)+1);
printf("%d,%d\n",*(m[1]+1),*(*(m+1)+1));}其運行結果如下:404,404,404,404,404412,412,412,412,412420,420,420,420,420414,4145,56.4指向二維數(shù)組的指針變量1.二維數(shù)組地址的表示方法
2.二維數(shù)組的指針變量二維數(shù)組指針變量說明的一般形式為:
類型說明符(*指針變量名)[長度];其中“類型說明符”為所指數(shù)組的數(shù)據(jù)類型?!?”表示其后的變量是指針類型?!伴L度”表示二維數(shù)組分解為多個一維數(shù)組時,一維數(shù)組的長度,也就是二維數(shù)組的列數(shù)?!?(p+i)+j”是二維數(shù)組i行j列的元素的地址,而“*(*(p+i)+j)”則是i行j列元素的值。6.4指向二維數(shù)組的指針變量1.二維數(shù)組地址的表示方法
2.二維數(shù)組的指針變量【例6.10】二維數(shù)組指針變量的應用舉例。main(){staticintm[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int
i,j;p=m;
for(i=0;i<3;I
for(j=0;j<4;j++)printf("%3d",*(*(p+i)+j));}該程序的運行結果為:012345678910116.5指向字符串的指針變量1.字符串的表示形式2.字符串指針變量與字符數(shù)組的區(qū)別在C語言中,可以用兩種方法訪問一個字符串。(1)第一種:用字符串指針指向一個字符串。(2)第二種:用字符數(shù)組存放一個字符串,然后輸出該字符串。6.5指向字符串的指針變量1.字符串的表示形式2.字符串指針變量與字符數(shù)組的區(qū)別【例6.11】編程實現(xiàn):把一個字符串的內容復制到另一個字符串中,要求不能使用strcpy函數(shù)。函數(shù)cprstr的形參為兩個字符指針變量pm和pn。其中,pm指向源字符串,pn指向目標字符串。這里要注意表達式“(*pn=*pm)!='\0'”的用法。程序代碼如下:#include<stdio.h>cprstr(char*pm,char*pn)/*定義字符串復制函數(shù)cpystr*/{while((*pn=*pm)!='\0') { pn++; pm++; }}6.5指向字符串的指針變量1.字符串的表示形式2.字符串指針變量與字符數(shù)組的區(qū)別main(){ char*pa="Human",b[10],*pb;
pb=b;
cprstr(pa,pb);/*調用字符串復制函數(shù)cpystr*/
printf("string_a=%s\nstring_b=%s\n",pa,pb);}程序的輸出結果為:string_a=Humanstring_b=Human6.5指向字符串的指針變量1.字符串的表示形式2.字符串指針變量與字符數(shù)組的區(qū)別簡化后的程序如下所示:#include<stdio.h>cprstr(char*pm,char*pn){
while((*pn++=*pm++)!='\0');}main(){ char*pa="Human",b[10],*pb;
pb=b;
cprstr(pa,pb); printf("string_a=%s\nstring_b=%s\n",pa,pb);}程序的輸出結果為:string_a=Humanstring_b=Human6.5指向字符串的指針變量1.字符串的表示形式2.字符串指針變量與字符數(shù)組的區(qū)別(1)在對字符數(shù)組作初始化賦值時,必須采用外部類型或靜態(tài)類型。(2)字符串指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續(xù)的內存空間中,并以'\0'作為串的結束。(3)字符串指針方式可以根據(jù)需要靈活使用。例如,對字符串指針方式:char*m="HelloHuman";可以改寫為另一種方式:char*m;m="HelloHuman";6.6.1指針型函數(shù)的定義方法1.定義的一般形式
2.例6.12
6.6指針型函數(shù)類型說明符*函數(shù)名(形參表){
函數(shù)體}其中函數(shù)名之前加了“*”號表明這是一個指針型函數(shù),即返回值將是一個指針。類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型。6.6.1指針型函數(shù)的定義方法1.定義的一般形式
2.例6.12
6.6指針型函數(shù)【例6.12】使用指針函數(shù)編寫程序,實現(xiàn)求兩個數(shù)中的較大者。#include<stdio.h>int*max(int
a,intb){ int*p;
if(a>b) p=&a; else p=&b; returnp;}main(){
printf("max=%d",*(max(12,56)));}6.6.2函數(shù)指針變量1.一般形式
2.例6.13
6.6指針型函數(shù)類型說明符(*指針變量名)();上面就是函數(shù)指針變量定義的一般形式,其中“類型說明符”表示被指函數(shù)的返回值的類型?!?*指針變量名)”表示“*”后面的變量是定義的指針變量。最后的空括號表示指針變量所指的是一個函數(shù)。例如:
int(*f1)();表示f1是一個指向函數(shù)入口的指針變量,該函數(shù)的返回值是整型。3.幾點注意事項
6.6.2函數(shù)指針變量1.一般形式
2.例6.13
6.6指針型函數(shù)【例6.13】編程實現(xiàn):求兩個整數(shù)中的較小者,在程序中使用指針形式實現(xiàn)對函數(shù)的調用。#include<stdio.h>int
min(int
a,intb){ if(a<b)returna; elsereturnb;}main(){ int
min(int
a,intb);
int(*pmin)();
int
x,y,z;
pmin=min;
printf("pleaseinputtwonumbers:\n");
scanf("%d%d",&x,&y); z=(*pmin)(x,y); printf("min_number=%d",z);}程序的運行情況為:pleaseinputtwonumbers:35↙23↙min_number=233.幾點注意事項
6.6.2函數(shù)指針變量1.一般形式
2.例6.13
6.6指針型函數(shù)(1)函數(shù)調用中“(*指針變量名)”兩邊的括號不可少,其中的“*”不應該理解為求值運算,在此處它只是一種表示符號。(2)不能讓函數(shù)指針變量參與算術運算,這是與數(shù)組指針變量不同的。應該特別注意的是:函數(shù)指針變量和指針型函數(shù)這兩者在寫法和意義上是有區(qū)別的。例如,float(*p)()和float*p()是兩個完全不同的概念,3.幾點注意事項
6.7指針數(shù)組1.指針數(shù)組的定義2.指針數(shù)組中的字符串指針數(shù)組定義的一般形式為:類型說明符*數(shù)組名[數(shù)組長度說明]例如:int*p[3];定義了一個有三個元素的指針數(shù)組,每個數(shù)組元素(指針變量)都可以指向一個整型變量。6.7指針數(shù)組1.指針數(shù)組的定義2.指針數(shù)組中的字符串【例6.14】指針數(shù)組應用舉例。intm[3][3]={1,2,3,4,5,6,7,8,9};int*pm[3]={m[0],m[1],m[2]};int*p=m[0];main(){inti;
for(i=0;i<3;i++) printf("%d,%d,%d\n",m[i][2-i],*m[i],*(*(m+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d\n",*pm[i],p[i],*(p+i));}該程序的運行結果如下:3,1,15,4,57,7,91,1,14,2,27,3,36.7指針數(shù)組1.指針數(shù)組的定義2.指針數(shù)組中的字符串指針數(shù)組也常用來表示一組字符串,這時指針數(shù)組的每個元素被賦予一個字符串的首地址。指向字符串的指針數(shù)組的初始化更為簡單。例如,采用指針數(shù)組來表示一組字符串,其初始化賦值如下:char*p[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};完成這個初始化賦值之后,p[0]即指向字符串“Monday”,……,p[6]指向“Sunday”。6.8.1一級指針和二級指針的概念6.8二級指針一級指針是直接指向數(shù)據(jù)對象的指針,即其中存放的是數(shù)據(jù)對象,如變量或數(shù)組元素的地址。二級指針是指向指針的指針,二級指針并不直接指向數(shù)據(jù)對象,而是指向一級指針的指針,也就是說,二級指針中存放的是一級指針的地址。下圖所示是一級指針和二級指針的示意圖。地址值指針變量(a)一級指針值地址地址二級指針一級指針變量(b)二級指針一級指針和二級指針的示意圖6.8.2二級指針的定義6.8二級指針二級指針的定義格式為:[存儲類型]數(shù)據(jù)類型**指針名;其中,指針名前面有兩個*,表示是一個二級指針。例如,有以下定義:inta,*pa,**pb;pa=&a;pb=&pa;則指針pa存放變量a的地址,即指向了變量a,指針pb存放一級指針pa的地址,即指向了pa。因此,pa是一級指針,pb是二級指針。6.8.3二級指針的使用6.8二級指針一般情況下,二級指針必須與一級指針聯(lián)合使用才有意義,不能將二級指針直接指向數(shù)據(jù)對象。【例6.15】用二級指針訪問二維數(shù)組。如果有如下定義:inta[3][4];int*p[3],**pp;p[0]=a[0];p[1]=a[1];p[2]=a[2];pp=p;6.8二級指針可以編制用二級指針訪問二維數(shù)組的程序如下:#include<stdio.h>main(){ staticinta[3][4]; staticint*p[3],**pp;
int
i,j; p[0]=a[0];p[1]=a[1];p[2]=a[2];p[3]=a[3]; pp=p;
printf("Pleaseenterthenumberofa[3][4]:\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)scanf("%d",pp[i]+j);
for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%5d",*(*(pp+i)+j));
printf("\n");}}程序的運行情況為:Pleaseenterthenumberofa[3][4]:123456789101112↙1 2 3 45 6 7 89 1011126.8.3二級指針的使用6.9程序舉例1.實例一2.實例二請按水果店里的水果名字(字符的字典順序)的順序對水果的名字進行排序,并輸出排序后的內容。下圖所示為對應的N-S流程圖。定義字符型數(shù)組name[N][5]存放水果的名稱定義指針數(shù)組*point[N]for(j=0;j<N;j++)point[j]=name[j]point(point,N)sort(point,N)point(point,N)main函數(shù)的N-S流程圖定義整型變量ifor(i=0;i<n;i++)輸出數(shù)組name[i]中的字符串print函數(shù)的N-S流程圖6.9程序舉例1.實例一2.實例二請按水果店里的水果名字(字符的字典順序)的順序對水果的名字進行排序,并輸出排序后的內容。下圖所示為對應的N-S流程圖。定義字符型指針變量tempfor(i=0;i<n-1;i++)k=ifor(j=i+1;j<n;j++)strcmp(name[k],name[j])>0?真假k=jk!=i?真假temp=name[i]
name[i]=name[k]
name[k]=tempsort函數(shù)的N-S流程圖6.9程序舉例1.實例一2.實例二#include<stdio.h>#include<string.h>#defineN6/*定義水果種類的數(shù)目,假設為6種*/voidsort(char*name[],int);/*排序函數(shù)sort的說明*/voidprint(char*name[],int);/*輸出函數(shù)print的說明*/main(){ staticcharname[N][80]={“orange","banana","apple","peach","grape","tomato"};/*定義二維數(shù)組存放水果的名稱*/6.9程序舉例1.實例一2.實例二char*point[N];/*定義指針數(shù)組*/
intj;
for(j=0;j<N;j++)point[j]=name[j];/*指針數(shù)組指向二維數(shù)組各行的首地址*/
printf("Thenameoffruitbeforesorted:\n");
print(point,N);/*輸出排序前的水果名*/
sort(point,N);/*調用函數(shù)sort對水果名按字典的順序進行排序*/
printf("\nThenameoffruitaftersorted:\n");
print(point,N);/*輸出排序后的水果名*/}6.9程序舉例1.實例一2.實例二voidsort(char*name[],intn){char*temp;
int
i,j,k;
for(i=0;i<n-1;i++){k=i;
for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j;
if(k!=i) {temp=name[i];
name[i]=name[k];
name[k]=temp;}}}6.9程序舉例1.實例一2.實例二voidprint(char*name[],intn)/*定義輸出函數(shù)print*/{inti;
for(i=0;i<n;i++)printf("%s\n",name[i]);}程序運行結果為:Thenameoffruitbeforesorted:orangebananaapplepeachgrapetomatoThenameoffruitaftersorted:Applebananagrapeorangepeachtomato6.9程序舉例1.實例一2.實例二用指針數(shù)組求兩個矩陣a,b的和,將結果存入a,并按矩陣的形式輸出。程序代碼如下:#include<stdio.h>#defineROW4/*定義矩陣的行數(shù),假設為4*/#defineCOL5/*定義矩陣的列數(shù),假設為5*/main(){/*定義二維數(shù)組a并賦初值*/
int[ROW][COL]={{9,22,76,59,10},{80,90,47,35,12},{16,81,50,29,23},{45,57,89,12,15}};6.9程序舉例1.實例一2.實例二/*定義二維數(shù)組b并賦初值*/
int
b[ROW][COL]={{23,10,17,49,0}, {53,17,75,67,5},{69,87,60,21,7},{13,25,37,49,50}};
int*p[2];/*定義指針數(shù)組*/
int
i,j; p[0]=a[0]; p[1]=b[0];
printf("matrix
a[%d][%d]is:\n",ROW,COL);
for(i=0;i<ROW;i++) {for(j=0;j<COL;j++)
printf(“%d",*(p[0]+j+COL*i));
printf("\n"); }6.9程序舉例1.實例一2.實例二
printf("matrix
b[%d][%d]is:\n",ROW,COL);
for(i=0;i<ROW;i++) {for(j=0;j<COL;j++)
printf(" %d",*(p[1]+j+COL*i));
printf("\n");}
printf("Thesumofthetwomatrixis:\n");
for(i=0;i<ROW;i++){
for(j=0;j<COL;j++){*(p[0]+j+COL*i)+=*(p[1]+j+COL*i);
printf(" %d",*(p[0]+j+COL*i));}
printf("\n");}}程序的輸出結果為:matrixa[4][5]is:922765910809047351216815029234557891215matrixb[4][5]is:2310174905317756756987602171325374950Thesumofthetwomatrixis:323293108101331071221021785168
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)用耕地租賃與農(nóng)業(yè)人才培養(yǎng)合同范本
- 二零二五年度太陽能熱水器推廣應用合同協(xié)議2篇
- 二零二五年度離婚協(xié)議中子女生活技能培訓及就業(yè)指導合同4篇
- 2025版寧波房地產(chǎn)糾紛調解合同范本4篇
- 2025年度苗木種植基地土地流轉與農(nóng)業(yè)保險合同4篇
- 二零二五年度建筑周轉材料租賃管理及服務合同2篇
- 2025年度鋼材市場拓展與營銷服務合同
- 二零二五年度門衛(wèi)智能識別系統(tǒng)采購合同4篇
- 二零二五年度內外墻抹灰工程安全質量監(jiān)督合同
- 2025年度個人向小額貸款公司借款合同范本2篇
- 《Python編程基礎與應用》面向對象編程
- 高考滿分作文常見結構完全解讀
- 理光投影機pj k360功能介紹
- 六年級數(shù)學上冊100道口算題(全冊完整版)
- 八年級數(shù)學下冊《第十九章 一次函數(shù)》單元檢測卷帶答案-人教版
- 帕薩特B5維修手冊及帕薩特B5全車電路圖
- 系統(tǒng)解剖學考試重點筆記
- 小學五年級解方程應用題6
- 云南省地圖含市縣地圖矢量分層地圖行政區(qū)劃市縣概況ppt模板
- 年月江西省南昌市某綜合樓工程造價指標及
- 作物栽培學課件棉花
評論
0/150
提交評論