C語言指針講解_第1頁
C語言指針講解_第2頁
C語言指針講解_第3頁
C語言指針講解_第4頁
C語言指針講解_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第十章使用指針1編輯課件

主要內(nèi)容10.1地址和指針的概念

10.2變量的指針和指向變量的指針變量

10.3通過指針引用數(shù)組

10.4通過指針字符串

10.5指向函數(shù)的指針

10.6返回指針值的函數(shù)

10.7指針數(shù)組和多重指針

10.8動態(tài)內(nèi)存分配與指向它的指針變量2編輯課件10.1地址和指針的概念

內(nèi)存區(qū)的每一個字節(jié)有一個編號,這就是“地址”。如果在程序中定義了一個變量,在對程序進行編譯時,系統(tǒng)就會給這個變量分配內(nèi)存單元。1、按變量地址存取變量值的方式稱為“直接訪問”方式printf(″%d″,i);scanf(″%d″,&i);k=i+j;3編輯課件4編輯課件2.另一種存取變量值的方式稱為“間接訪問”的方式。即,將變量i的地址存放在另一個變量中。在C語言中,指針是一種特殊的變量,它是存放地址的。5編輯課件一個變量的地址稱為該變量的“指針”。例如,地址2000是變量i的指針。如果有一個變量專門用來存放另一變量的地址(即指針),則它稱為“指針變量”。上述的i_pointer就是一個指針變量。指針和指針變量的定義:6編輯課件10.2變量的指針和指向變量的指針變量10.2.1怎樣定義指針變量定義指針變量的一般形式為基類型*指針變量名;7編輯課件下面都是合法的定義:float*pointer_3;

char*pointer_4;可以用賦值語句使一個指針變量得到另一個變量的地址,從而使它指向一個該變量。例如:pointer_1=&i;pointer_2=&j;8編輯課件在定義指針變量時要注意兩點:指針變量前面的“*”,表示該變量的類型為指針型變量。例:float*pointer_1;指針變量名是pointer_1

,而不是*pointer_1

。(2)在定義指針變量時必須指定基類型。需要特別注意的是,只有整型變量的地址才能放到指向整型變量的指針變量中。下面的賦值是錯誤的∶

floata;int*pointer_1;pointer_1=&a;9編輯課件在對指針變量賦值時需要注意兩點:⑴指針變量中只能存放地址(指針),不要將一個整數(shù)賦給一個指針變量。例:*pointer_1=100;

/*pointer_1是指針變量,100是整數(shù),不合法*/(2)賦給指針變量的變是量地址不能是任意的類型,而只能是與指針變量的基類型具有相同類型的變量的地址。10編輯課件在引用指針變量時,可能有三種情況:⑴給指針變量賦值。如:

p=&a;⑵引用指針變量的值。如:

printf(“%o”,p);⑶引用指針變量指向的變量。有關(guān)的兩個運算符:&取地址運算符。&a是變量a的地址。*指針運算符(或稱“間接訪問”運算符),*p是指針變量p指向的對象的值。10.2.2怎樣引用指針變量11編輯課件例10.1通過指針變量訪問整型變量#include<stdio.h>void

main(){inta,b;

int*pointer_1,*pointer_2;a=100;b=10;

pointer_1=&a;/*把變量a的地址賦給

pointer_1*/pointer_2=&b;/*把變量b的地址賦給

pointer_2*/printf(″%d,%d\n″,a,b);printf(″%d,%d\n″,*pointer_1,*pointer_2);}12編輯課件13編輯課件例10.2輸入a和b兩個整數(shù),按先大后小的順序輸出a和b。#include<stdio.h>voidmain(){int*p1,*p2,*p,a,b;

scanf(″%d,%d″,&a,&b);p1=&a;p2=&b;

if(a<b){p=p1;p1=p2;p2=p;}

printf(″a=%d,b=%d\n\n″,a,b);

printf(″max=%d,min=%d\n″,*p1,*p2);}14編輯課件運行情況如下:5,9↙

a=5,b=9max=9,min=5當(dāng)輸入a=5,b=9時,由于a<b,將p1和p2交換。交換前的情況見圖(a),交換后見圖(b)。15編輯課件16編輯課件10.2.3指針變量作為函數(shù)參數(shù)例10.3對輸入的兩個整數(shù)按大小順序輸出

#include<stdio.h>voidmain(){voidswap(int*p1,int*p2);

inta,b;

int*pointer_1,*pointer_2;

scanf(″%d,%d″,&a,&b);

pointer_1=&a;pointer_2=&b;

if(a<b=swap(pointer_1,pointer_2);

printf(″\n%d,%d\n″,a,b);}

17編輯課件voidswap(int*p1,int*p2){inttemp;

temp=*p1;*p1=*p2;*p2=temp;}18編輯課件19編輯課件例10.4輸入3個整數(shù)a,b,c,要求按大小順序?qū)⑺鼈冚敵?。用函?shù)實現(xiàn)改變這3個變量的值。#include<stdio.h>voidmain(){voidexchange(int*q1,int*q2,int*q3);

inta,b,c,*p1,*p2,*p3;

scanf(″%d,%d,%d″,&a,&b,&c);p1=&a;p2=&b;p3=&c;

exchange(p1,p2,p3);

printf(″\n%d,%d,%d\n″,a,b,c);}20編輯課件voidexchange(int*q1,int*q2,int*q3){voidswap(int*pt1,int*pt2);if(*q1<*q2)swap(q1,q2);

if(*q1<*q3)swap(q1,q3);

if(*q2<*q3=swap(q2,q3);}voidswap(int*pt1,int*pt2){inttemp;

temp=*pt1;*pt1=*pt2;*pt2=temp;}21編輯課件

10.3通過指針引用數(shù)組一個變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。指針變量既然可以指向變量,當(dāng)然也可以指向數(shù)組元素(把某一元素的地址放到一個指針變量中)。所謂數(shù)組元素的指針就是數(shù)組元素的地址。10.3.1數(shù)組元素的指針22編輯課件可以用一個指針變量指向一個數(shù)組元素。例如:inta[10];

(定義a為包含10個整型數(shù)據(jù)的數(shù)組)

int*p;

(定義p為指向整型變量的指針變量)

p=&a[0];

(把a[0]元素的地址賦給指針變量p)也就是使p指向a數(shù)組的第0號元素。23編輯課件24編輯課件C語言規(guī)定在指針指向數(shù)組元素時,可以對指針進行以下運算:加一個整數(shù)(用+或+=),如p+1

減一個整數(shù)(用-或-=),如p-1

自加運算,如p++,++p

自減運算,如p--,--p

兩個指針相減,如p1-p2(只有p1和p2都指向同一數(shù)組中的元素時才有意義)。10.3.2指針的運算25編輯課件分別說明如下:如果指針變量p已指向數(shù)組中的一個元素,則p+1指向同一數(shù)組中的下一個元素,p-1指向同一數(shù)組中的上一個元素。(2)如果p原來指向a[0],執(zhí)行++p后p的值改變了,在p的原值基礎(chǔ)上加d,這樣p就指向數(shù)組的下一個元素a[1]。(3)如果p的初值為&a[0],則p+i和a+i就是數(shù)組元素a[i]的地址,或者說,它們指向a數(shù)組的第i個元素。*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即a[i]。(5)如果指針變量p1和p2都指向同一數(shù)組,如執(zhí)行p2-p1,結(jié)果是兩個地址之差除以數(shù)組元素的長度。26編輯課件10.3.3通過指針引用數(shù)組元素引用一個數(shù)組元素,可以用:

(1)下標(biāo)法,如a[i]形式;(2)指針法,如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組元素的指針變量,其初值p=a。例10.5輸出數(shù)組中的全部元素

假設(shè)有一個a數(shù)組,整型,有10個元素。要輸出各元素的值有三種方法:27編輯課件(1)下標(biāo)法#include<stdio.h>voidmain(){inta[10];

inti;

for(i=0;i<10;i++)

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

printf(″\n″);

for(i=0;i<10;i++)

printf(″%d″,a[i]);}28編輯課件(2)通過數(shù)組名計算數(shù)組元素地址,找出元素的值。#include<stdio.h>void

main(){inta[10];

inti;

for(i=0;i<10;i++)

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

printf(″\n″);

for(i=0;i<10;i++)

printf(″%d″,*(a+i));}29編輯課件(3)用指針變量指向數(shù)組元素。#include<stdio.h>voidmain(){inta[10];

int*p,i;

for(i=0;i<10;i++)

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

printf(″\n″);

for(p=a;p<(a+10);p++)

printf(″%d″,*p);}30編輯課件例10.6通過指針變量輸出a數(shù)組的10個元素。#include<stdio.h>voidmain(){int*p,i,a[10];p=a;

for(i=0;i<10;i++)

scanf(″%d″,p++);

printf(″\n″);

for(i=0;i<10;i++,p++)

printf(″%d″,*p);}程序運行情況:12345671090↙

221532340030036252021163110259102372104103顯然輸出的數(shù)值并不是a數(shù)組中各元素的值31編輯課件#include<stdio.h>void

main(){int*p,i,a[10];p=a;

for(i=0;i<10;i++)

scanf(″%d″,p++);

printg(″\n″);

p=a;

for(i=0;i<10;i++,p++)

printf(″%d″,*p);}程序運行情況:12345671090↙

1234567109032編輯課件10.3.4用數(shù)組名作函數(shù)參數(shù)在第7章中介紹過可以用數(shù)組名作函數(shù)的參數(shù)。如:voidmain()

{if(intarr[],intn);intarray[10];┇f(array,10);┇}

voidf(intarr[],intn){┇}33編輯課件例10.7將數(shù)組a中n個整數(shù)按相反順序存放34編輯課件#include<stdio.h>voidmain(){voidinv(intx[],intn);inti,a[10]={3,7,9,11,0,6,7,5,4,2};

printf(″Theoriginalarray:\n″);

for(i=0;i<10;i++)

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

printf(″\n″);

inv(a,10);

printf(″Thearrayhasbeeninverted:\n″);

for(i=0;i<10;i++)

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

printf(″\n″);}35編輯課件voidinv(intx[],intn)/*形參x是數(shù)組名*/

{inttemp,i,j,m=(n-1)/2;

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

temp=x[i];x[i]=x[j];x[j]=temp;}

return;}運行情況如下:Theoriginalarray:3,7,9,11,0,6,7,5,4,2Thearrayhasbeeninverted:2,4,5,7,6,0,11,9,7,336編輯課件37編輯課件#include<stdio.h>voidmain(){voidinv(int*x,intn);inti,a[10]={3,7,9,11,0,6,7,5,4,2};

printf(″Theoriginalarray:\n″);

for(i=0;i<10;i++)

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

printf(″\n″);

inv(a,10);

printf(″Thearrayhasbeeninverted:\n″);

for(i=0;i<10;i++)

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

printf(″\n″);}對剛才的程序可以作一些改動。將函數(shù)inv中的形參x改成指針變量。

38編輯課件voidinv(int*x,intn)/*形參x為指針變量*/{intp,temp,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;

for(;i<=p;i++,j--){temp=*i;*i=*j;*j=temp;}

return;}39編輯課件如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組中的元素的值,實參與形參的對應(yīng)關(guān)系有以下4種情況:(1)形參和實參都用數(shù)組名,如:voidmain()voidf(intx[],intn){inta[10];{……

f(a,10);}

}40編輯課件41編輯課件(2)實參用數(shù)組名,形參用指針變量。如:voidmain()voidf(int*x,intn){inta[10];{……

f(a,10);}

}(3)實參形參都用指針變量。例如:voidmain()voidf(int*x,intn){inta[10],*p=a;{┇┇

f(p,10);}

}42編輯課件43編輯課件(4)實參為指針變量,形參為數(shù)組名。如:

voidmain()voidf(intx[],intn){inta[10],*p=a;{┇┇

f(p,10);}

}44編輯課件#include<stdio.h>voidmain(){voidinv(int*x,intn);inti,arr[10],*p=arr;

printf(″Theoriginalarray:\n″);

for(i=0;i<10;i++,p++)

scanf(″%d″,p);

printf(″\n″);p=arr;

inv(p,10);/*實參為指針變量*/printf(″Thearrayhasbeeninverted:\n″);

for(p=arr;p<arr+10;p++)

printf(″%d″,*p);

printf(″\n″);}例10.8用實參指針變量改寫例10.7。

45編輯課件voidinv(int*x,intn){intp,m,temp,*i,*j;m=(n-1)/2;i=x;j=x+n-1;p=x+m;

for(;i<=p;i++,j--){temp=*i;*i=*j;*j=temp;}

return;}46編輯課件例10.9用選擇法對10個整數(shù)按由大到小順序排序

#include<stdio.h>voidmain(){voidsort(intx[],intn);int*p,i,a[10];p=a;

for(i=0;i<10;i++)

scanf(″%d″,p++);p=a;

sort(p,10);

for(p=a,i=0;i<10;i++){printf(″%d″,*p);p++;}}47編輯課件voidsort(intx[],intn){inti,j,k,t;

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

for(j=i+1;j<n;j++)if(x[j]>x[k])k=j;if(k?。剑椋簦剑郏椋?;x[i]=x[k];x[k]=t;}}}48編輯課件10.3.5通過指針引用多維數(shù)組用指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。但在概念上和使用上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些。1.多維數(shù)組元素的地址先回顧一下多維數(shù)組的性質(zhì),可以認為二維數(shù)組是“數(shù)組的數(shù)組”,例:定義inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};則二維數(shù)組a是由3個一維數(shù)組所組成的。設(shè)二維數(shù)組的首行的首地址為2000,則表示形式含義地址a

二維數(shù)組名,指向一維數(shù)組a[0],即0行首地址2000a[0],*(a+0),*a0行0列元素地址2000a+1,&a[1]1行首地址20010a[1],*(a+1)1行0列元素a[1][0]的地址20010a[1]+2,*(a+1)+2,&a[1][2]1行2列元素a[1][2]的地址2012*(a[1]+2),*(*(a+1)+2),a[1][2]1行2列元素a[1][2]的值元素值為132.指向多維數(shù)組元素的指針變量(1)指向數(shù)組元素的指針變量例10.10用指向元素的指針變量輸出二維數(shù)組元素的值

#include<stdio.h>voidmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;

for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)

printf(″\n″);

printf(″%4d″,*p);}}運行結(jié)果如下:1357911131519212351編輯課件(2)用指向由m個元素組成的一維數(shù)組的指針變量例10.11輸出二維數(shù)組任一行任一列元素的值#include<stdio.h>voidmain(){inta[3][4]={1,3,5,7,9,11,

13,15,17,19,21,23};

int(*p)[4],i,j;p=a;

scanf(″i=%d,j=%d″,&i,&j);

printf(″a[%d,%d]=%d\n″,i,j,*(*(p+i)+j));}運行情況如下:i=1,j=2↙(本行為鍵盤輸入)a[1,2]=1352編輯課件3.用指向數(shù)組的指針作函數(shù)參數(shù)例10.12有一個班,3個學(xué)生,各學(xué)4門課,計算總平均分數(shù)以及第n個學(xué)生的成績。這個題目是很簡單的。只是為了說明用指向數(shù)組的指針作函數(shù)參數(shù)而舉的例子。用函數(shù)average求總平均成績,用函數(shù)search找出并輸出第i個學(xué)生的成績。53編輯課件#include<sydio.h>voidmain(){voidaverage(float*p,intn);

voidsearch(float(*p)[4],intn);

floatscore[3][4]={{65,67,70,60},{100,

107,90,101},{90,99,100,910}};average(*score,12);/*求12個分數(shù)的平均分*/search(score,2);/*求序號為2的學(xué)生的成績*/}54編輯課件voidaverage(float*p,intn){float*p_end;

floatsum=0,aver;

p_end=p+n-1;

for(;p<=p_end;p++)

sum=sum+(*p);

aver=sum/n;

printf(″average=%5.2f\n″,aver);}55編輯課件voidsearch(float(*p)[4],intn)

/*p是指向具有4個元素的一維數(shù)組的指針*/{inti;

printf(″thescoreofNo.%dare:\n″,n);

for(i=0;i<4;i++)printf(″%5.2f″,*(*(p+n)+i));}程序運行結(jié)果如下:average=102.25ThescoreofNo.2are:90.0099.00100.00910.0056編輯課件例10.13在上題基礎(chǔ)上,查找有一門以上課程不及格的學(xué)生,打印出他們的全部課程的成績。

#include<stdio.h>voidmain(){voidsearch(float(*p)[4],intn);/*函數(shù)聲明*/floatscore[3][4]={{65,57,70,60},{510,107,

90,101},{90,99,100,910}};search(score,3);}57編輯課件voidsearch(float(*p)[4],intn){inti,j,flag;

for(j=0;j<n;j++)

{flag=0;

for(i=0;i<4;i++)if(*(*(p+j)+i)<60)

flag=1;

if(flag==1)

{printf("No.%dfails,hisscoresare:\n",j+1);

for(i=0;i<4;i++)

printf(″%5.1f″,*(*(p+j)+i));

printf(″\n″);}}}

程序運行結(jié)果如下:No.1fails,hisscoresare:65.057.070.060.0No.2fails,hisscoresare:510.0107.090.0101.058編輯課件10.4通過指針引用字符串10.4.1字符串的表示形式

例10.14定義一個字符數(shù)組,對它初始化,然后輸出該字符串

#include<stdio.h>voidmain(){charstring[]=″IloveChina!″;

printf(″%s\n″,string);}(1)用字符數(shù)組存放一個字符串,然后輸出該字符串。59編輯課件(2)用字符指針指向一個字符串可以不定義字符數(shù)組,而定義一個字符指針。用字符指針指向字符串中的字符。例10.15定義字符指針,使它指向一個字符串。#include<stdio.h>voidmain(){charstring=″IloveChina!″;

printf(″%s\n″,string);}60編輯課件例10.16將字符串a復(fù)制為字符串b

#include<stdio.h>voidmain(){chara[]=″Iamaboy.″,b[20];

inti;

for(i=0;*(a+i)?。健洌埽啊洌唬椋?(b+i)=*(a+i);*(b+i)=′\0′;

printf(″stringais:%s\n″,a);

printf(″stringbis:″);

for(i=0;b[i]!=′\0′;i++)

printf(″%c″,b[i]);

printf(″\n″);}61編輯課件也可以設(shè)指針變量,用它的值的改變來指向字符串中的不同的字符。例10.17用指針變量來處理例10.16問題。#include<stdio.h>voidmain(){chara[]=″Iamaboy.″,b[20],*p1,*p2;

inti;p1=a;p2=b;

for(;*p1!=′\0′;p1++,p2++)62編輯課件*p2=*p1;*p2=′\0′;printf(″stringais:%s\n″,a);

printf(″stringbis:″);for(i=0;b[i]?。健洌埽啊?;i++)

printf(″%c″,b[i]);

printf(″\n″);}程序必須保證使p1和p2同步移動

63編輯課件64編輯課件10.4.2字符指針作函數(shù)參數(shù)例10.110用函數(shù)調(diào)用實現(xiàn)字符串的復(fù)制

#include<stdio.h>voidmain(){voidcopy_string(char*from,char*to);char*a="Iamateacher.";charb[]="Youareastudent.";char*p=b;printf("stringa=%s\nstringb=%s\n",a,p);printf("copystringatostringb:\n");copy_string(a,p);printf("\nstringa=%s\nstringb=%s\n",a,b);}(1)用字符數(shù)組作參數(shù)65編輯課件voidcopy_string(char*from,char*to){for(;*from!='\0';from++,to++){*to=*from;}*to='\0';}程序運行結(jié)果如下:

stringa=Iamateacher.

stringb

=Y(jié)ouareastudent.

copystringatostringb:stringa=Iamateacher.stringb=Iamateacher.66編輯課件1、將copy_string函數(shù)改寫為voidcopy_string(char*from,char*to){while((*to=*from)!=′\0′){to++;from++;}}

對copy_string函數(shù)還可以改寫得更精練一些,請分析以下幾種情況:

2、copy_string函數(shù)的函數(shù)體還可改為{

while((*to++=*from++)!=′\0′);}67編輯課件3、copy_string函數(shù)的函數(shù)體還可寫成{while(*from?。健洌埽啊洌?to++=*from++;*to=′\0′;}4、由于字符可以用其ASCII碼來代替所以函數(shù)體可簡化為:

{while(*from)*to++=*from++;*to=′\0′;}

68編輯課件5、上面的while語句還可以進一步簡化為下面的while語句:while(*to++=*from++);它與下面語句等價:while((*to++=*from++)?。健洌埽啊洌?;將*from賦給*to,如果賦值后的*to值等于′\0′則循環(huán)終止(′\0′已賦給*to)

6、函數(shù)體中while語句也可以改用for語句:for(;(*to++=*from++)?。剑?;);或for(;*to++=*from++;);69編輯課件7、也可以用字符數(shù)組名作函數(shù)形參,在函數(shù)中另定義兩個指針變量p1,p2。函數(shù)copy_string可寫為voidcopy_string(charfrom[],charto[]){char*p1,*p2;p1=from;p2=to;

while((*p2++=*p1++)?。健洌埽啊洌?;}10.4.3對使用字符指針變量和字符數(shù)組的討論字符數(shù)組和字符指針變量二者之間的區(qū)別主要有以下幾點:70編輯課件(1)字符數(shù)組由若干個元素組成,每個元素中放一個字符,而字符指針變量中存放的是地址(字符串第1個字符的地址),決不是將字符串放到字符指針變量中。(2)賦值方式。對字符數(shù)組只能對各個元素賦值,不能用以下辦法對字符數(shù)組賦值。

charstr[14];

str=″IloveChina!″;而對字符指針變量,可以采用下面方法賦值:

char*a;a=″IloveChina!″;71編輯課件(3)對字符指針變量賦初值:

char*a=″IloveChina!″;等價于

char*a;a=″IloveChian!″;而對數(shù)組的初始化:

charstr[14]={″IloveChina!″};

不能等價于

charstr[14];

str[]=″IloveChina!″;72編輯課件(4)定義了一個字符數(shù)組,在編譯時為它分配內(nèi)存單元,它有確定的地址。而定義一個字符指針變量時,給指針變量分配內(nèi)存單元,在其中可以放一個字符變量的地址。例如:charstr[10];

scanf(″%s″,str);73編輯課件(5)指針變量的值是可以改變的,例如:例10.19改變指針變量的值#include<stdio.h>voidmain(){char*a=″IloveChina!″;a=a+7;

printf(″%s″,a);}74編輯課件(6)若字符指針變量p指向字符串,就可以用指針變量帶下標(biāo)的形式引用所指的字符串中的字符。如有:

char*a=″IloveChina!″;(7)字符數(shù)組中各元素的值是可以改變的(可以對它們再賦值),但字符指針變量指向的字符串中的內(nèi)容是不可以被取代的(不能對它們再賦值)。如:

chara[]=”House”;char*b=”House”;a[2]=’r’;/*合法,r取代u*/b[2]=’r’;/*非法,字符串常量不能改變*/

75編輯課件10.5指向函數(shù)的指針10.5.1什么是函數(shù)指針

如果在程序中定義了一個函數(shù),在編譯時,編譯系統(tǒng)為函數(shù)代碼分配一段存儲空間,這段存儲空間的起始地址(又稱入口地址)稱為這個函數(shù)的指針??梢远x一個指向函數(shù)的指針變量,用來存放某一函數(shù)的起始地址,這就意味著此指針變量指向該函數(shù)。76編輯課件10.5.2用函數(shù)指針變量調(diào)用函數(shù)

如果想調(diào)用一個函數(shù),除了可以通過函數(shù)名調(diào)用以外,還可以通過指向函數(shù)的指針變量來調(diào)用該函數(shù)。例10.20用函數(shù)求a和b中的大者。(1)通過函數(shù)名調(diào)用函數(shù)。77編輯課件#include<stdio.h>void

main(){intmax(int,int);

inta,b,c;

printf("pleaseenteraandb:");

scanf(″%d,%d″,&a,&b);c=max(a,b);

printf(″a=%d,b=%d,max=%d

″,a,b,c);}

intmax(intx,inty){intz;

if(x>y)z=x;

elsez=y;

return(z);}運行情況如下:pleaseenteraandb:3,10↙a=3,b=10,max=1078編輯課件將程序改寫為#include<stdio.h>void

main()

{intmax(int,int);int(*p)(int,int);inta,b,c;p=max;printf("pleaseenteraanbb:");scanf("%d,%d",&a,&b);c=(*p)(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c);}intmax(intx,inty){intz;if(x>y)z=x; elsez=y;return(z);}(2)通過指針變量來訪問它指向的函數(shù)。79編輯課件例10.21輸入兩個整數(shù),然后讓用戶選擇1或2,選1時調(diào)用max函數(shù),輸出二者中的大數(shù),選1時調(diào)用min函數(shù),輸出二者中的小數(shù)。#include<stdio.h>voidmain()

{intmax(int,int);intmin(int,int);int(*p)(int,int);inta,b,c,n;printf("pleaseenteraandb:");scanf("%d,%d",&a,&b);printf("pleasechoose1or2:");scanf("%d",&n);if(n==1)p=max;80編輯課件elseif(n==2)p=min;c=(*p)(a,b);printf("a=%d,b=%d,",a,b);if(n==1)printf("max=%d\n",c);elseprintf("min=%d\n",c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmin(intx,inty){intz;if(x<y)z=x;elsez=y;return(z);}運行情況如下:pleaseenteraandb:4,9↙pleasechoose1or2:1↙a=3,b=10,max=10再運行一次:pleaseenteraandb:4,9↙pleasechoose1or2:2↙a=3,b=10,min=381編輯課件10.5.3用指向函數(shù)的指針作函數(shù)參數(shù)函數(shù)指針變量常用的用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。指向函數(shù)的指針也可以作為參數(shù),以實現(xiàn)函數(shù)地址的傳遞,這樣就能夠在被調(diào)用的函數(shù)中使用實參函數(shù)。82編輯課件

實參函數(shù)名f1f2↓↓voidfun(int(*x1)(int),int(*x2)(int,int)){inta,b,i,j;a=(*x1)(i);/*調(diào)用f1函數(shù)*/b=(*x2)(i,j);/*調(diào)用f2函數(shù)*/}83編輯課件例10.22有兩個整數(shù)a和b,由用戶輸入1,2或3。如輸入1,程序就給出a和b中大者,輸入2,就給出a和b中小者,輸入3,則求a與b之和。#include<stdio.h>voidmain()

{intmax(int,int);/*函數(shù)聲明*/intmin(int,int);/*函數(shù)聲明*/intadd(int,int);/*函數(shù)聲明*/intfun(intx,inty,int(*p)(int,int));/*函數(shù)聲明*/inta=34,b=-21,n;printf("pleasechoose1,2or3:");scanf("%d",&n);if(n==1)fun(a,b,max);elseif(n==2)fun(a,b,min);elseif(n==3)fun(a,b,add);}

84編輯課件intmin(intx,inty){intz;if(x<y)z=x;elsez=y;printf("min=%d");return(z);}intadd(intx,inty){intz;z=x+y;printf("sum=%d");return(z);}intfun(intx,inty,int(*p)(int,int)){intresout;resout=(*p)(x,y);printf("%d\n",resout);}運行情況如下:①pleasechoose1,2or3:1↙

max=34②pleasechoose1,2or3:2↙min=21③pleasechoose1,2or3:3↙sum=1385編輯課件10.6返回指針值的函數(shù)一個函數(shù)可以帶回一個整型值、字符值、實型值等,也可以帶回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是帶回的值的類型是指針類型而已。這種帶回指針值的函數(shù),一般定義形式為類型名*函數(shù)名(參數(shù)表列);例如:int*a(intx,inty);86編輯課件例10.23有若干個學(xué)生的成績(每個學(xué)生有4門課程),要求在用戶輸入學(xué)生序號以后,能輸出該學(xué)生的全部成績。用指針函數(shù)來實現(xiàn)。

#include<stdio.h>voidmain(){float*score[][4]={{60,70,100,90},

{56,109,67,1010},{34,710,90,66}};float*search(float(*pointer)[4],intn);

float*p;

inti,m;

printf(″enterthenumberofstudent:″);

scanf(″%d″,&m);

printf(″ThescoresofNo.%dare:\n″,m);

87編輯課件

p=search(score,m);

for(i=0;i<4;i++=

printf(″%5.2f\t″,*(p+i));}float*search(float(*pointer)[4],intn){float*pt;pt=*(pointer+n);

return(pt);}

運行情況如下:enterthenumberofstudent:1↙

ThescoresofNo.1are:56.00109.0067.001010.0088編輯課件10.7指針數(shù)組和多重指針10.7.1指針數(shù)組的概念一個數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,指針數(shù)組中的每一個元素都相當(dāng)于一個指針變量。一維指針數(shù)組的定義形式為:類型名數(shù)組名[數(shù)組長度];例如:int*p[4];89編輯課件90編輯課件例10.24將若干字符串按字母順序(由小到大)輸出。#include<stdio.h>#include<string.h>voidmain(){voidsort(char*name[],intn);

voidprintf(char*name[],intn);

char*name[]={"Followme","BASIC","GreatWall″,"FORTRAN","Computerdesign"};

intn=5;

sort(name,n);

print(name,n);}91編輯課件voidsort(char*name[],intn){char*temp;

inti,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;}}}

92編輯課件voidprint(char*name[],intn){inti;for(i=0;i<n;i++)

printf(″%s\n″,name[i]);

}運行結(jié)果為:BASICComputerdesignFORTRANFollowmeGreatWall93編輯課件10.7.2指向指針數(shù)據(jù)的指針定義一個指向指針數(shù)據(jù)的指針變量:char**p;p的前面有兩個*號。*運算符的結(jié)合性是從右到左,因此**p相當(dāng)于*(*p),顯然*p是指針變量的定義形式。如果沒有最前面的*,那就是定義了一個指向字符

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論