版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024智能計算中心創(chuàng)新發(fā)展指南
- 2025年九年級統(tǒng)編版語文寒假復(fù)習(xí) 03 第三周:九上第四、五單元復(fù)習(xí)
- 【全程復(fù)習(xí)方略】2020-2021學(xué)年北師大版高中數(shù)學(xué)必修一課時作業(yè)(九)-2.2.3
- 【名師一號】2021年新課標(biāo)版歷史-必修3-雙基限時練4
- 2022屆高考物理第一輪復(fù)習(xí)-課時跟蹤檢測(十九)-功能關(guān)系-能量守恒定律
- 【全程設(shè)計】2021屆高考生物一輪復(fù)習(xí)細致講解練:選修3-第一講-基因工程
- 【與名師對話】2022高考地理課標(biāo)版總復(fù)習(xí)課時跟蹤訓(xùn)練38世界地理概況-
- 【全程復(fù)習(xí)方略】2020年數(shù)學(xué)文(廣西用)課時作業(yè):第七章-第四節(jié)曲線與方程
- 五年級數(shù)學(xué)(小數(shù)除法)計算題專項練習(xí)及答案匯編
- 【導(dǎo)學(xué)案】2021版高中歷史(人教版-必修2)教師用書-7單元-復(fù)習(xí)課
- 期末測試(試題)-三年級數(shù)學(xué)上冊人教版
- 藥劑科門診中成西藥房利用PDCA循環(huán)降低門診藥房調(diào)劑內(nèi)差發(fā)生率品管圈QCC成果匯報
- 物料員工作計劃與總結(jié)
- 浙江省金華市2023年九年級上學(xué)期期末數(shù)學(xué)試題附答案
- JGT292-2010 潔凈工作臺標(biāo)準(zhǔn)
- 圣誕節(jié)元旦搞笑小品就劇本:浪子回家
- 2023年海南省天一大聯(lián)考高一化學(xué)第一學(xué)期期末達標(biāo)測試試題含解析
- 銀行工會個人總結(jié)報告
- 部編版小學(xué)語文2-6年級詞語表
- 甘肅省平?jīng)鍪嗅轻紖^(qū)2024屆九年級英語第一學(xué)期期末統(tǒng)考模擬試題含解析
- 測繪法規(guī)與工程管理(第2版)完整全套教學(xué)課件
評論
0/150
提交評論