課程-13級(jí)語言c10第10章指針_第1頁
課程-13級(jí)語言c10第10章指針_第2頁
課程-13級(jí)語言c10第10章指針_第3頁
課程-13級(jí)語言c10第10章指針_第4頁
課程-13級(jí)語言c10第10章指針_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余54頁可下載查看

付費(fèi)下載

下載本文檔

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

文檔簡介

1第10章指針C

語言程序設(shè)計(jì)南京信息工程大學(xué)計(jì)算機(jī)系2022/12/262

10.1地址和指針的概念10.2變量的指針和指向變量的指針變量10.3數(shù)組與指針10.4字符串與指針10.5指向函數(shù)的指針10.6返回指針的函數(shù)10.7指針數(shù)組和指向指針的指針

主要內(nèi)容2022/12/26310.1地址和指針的概念

main(){floatx;inty;

…}有關(guān)變量的兩個(gè)概念

200020012002200320042005…xy變量的地址變量的內(nèi)容2022/12/26410.1地址和指針的概念

main(){inta,b,c;a=5;b=3;c=a

+b;

…}200020012002200320042005abc5直接將整數(shù)

5

存入變量a3直接將整數(shù)

3

存入變量b8直接將變量a、b

的值取出,相加后存入變量

c

利用變量名存取數(shù)據(jù)的方式稱為“直接存取”方式。2022/12/265

C語言還提供了對(duì)內(nèi)存單元的“間接存取”方式p20002001200220032004200520062007abc532004a和b相加的結(jié)果(*p=a+b)存放到變量p所指向的內(nèi)存單元中去。此時(shí)c稱為指針變量p的目標(biāo)變量。p2004cp=&c8

main(){inta=5,b=3,c,*p;

p=&c;*p=a+b;

…}10.1地址和指針的概念●地址形象化地稱為指針●變量的地址稱為變量的指針●存放地址的變量稱為指針變量2022/12/266

main(){inta,*p=&a;floatx,*q=&x;

…}2000200120022003200420052006200720082009apxq200410.2變量的指針和指向變量的指針變量10.2.1指針變量的定義2000main(){inta,*p;floatx,*q;

p=&a;q=&x;

…}指針變量定義的形式指針變量初始化一般形式:基類型*指針變量名2022/12/267

main(){inta,*p=&a;floatx,*q=&x;

*p=5;printf("a+3=%d\n",*p+3);

…}&取地址運(yùn)算符*指針運(yùn)算符(“間接訪問”)2000200120022003200420052006200720082009apxq200410.2變量的指針和指向變量的指針變量10.2.2指針變量的引用2000*p=&a;×main(){inta,*p;floatx,*q;

p=&a;q=&x;

…}5自右至左優(yōu)先權(quán)相等2022/12/268方法1:目標(biāo)變量值不變,改變指針變量的

指向求解。

main(){inta,b,*p1,*p2,*p;

p1=&a;p2=&b;scanf(″%d%d″,p1,p2);if(*p1<*p2){p=p1;p1=p2;p2=p;}printf(″a=%d,b=%d\n″,a,b);

printf(″max=%d,min=%d\n″,*p1,*p2);}abp1p2p68a=6,b=8max=8,min=610.2變量的指針和指向變量的指針變量【例10.1】輸入a、b兩個(gè)整數(shù),使用指針變量按先大后小順序輸出

這兩個(gè)整數(shù)。

10.2.2指針變量的引用2022/12/269方法2:利用指針變量直接改變目標(biāo)變量的值

求解。

main(){inta,b,t,*p1,*p2;

p1=&a;p2=&b;scanf(″%d%d″,p1,p2);if(*p1<*p2){t=*p1;*p1=*p2;*p2=t;}printf(″a=%d,b=%d\n″,a,b);

printf(″max=%d,min=%d\n″,*p1,*p2);}a、*p1b、*p2p1p2t68a=8,b=6max=8,min=668610.2變量的指針和指向變量的指針變量10.2.2指針變量的引用2022/12/2610指針的加減運(yùn)算

10.2變量的指針和指向變量的指針變量注意指針的基本運(yùn)算main(){inta[]={10,20,30,40,50},*p1,*p2;

p1=p2=a;printf(″p1=%u,*p1=%d\n″,p1,*p1);

p2+=3;printf(″p2=%u,*p2=%d\n″,p2,*p2);}P1=404,*p1=10P2=410,*p2=40404405406407408409410411412413a[0]a[1]a[2]a[3]a[4]3020104050p1p2指針加減運(yùn)算要點(diǎn):①只有當(dāng)指針變量指向數(shù)組時(shí)指針的加減

運(yùn)算才有意義。②指針變量可加減一個(gè)整型表達(dá)式。如:

p1++、p2+3、p2--、p2-2。③

指針的加減運(yùn)算是以基類型為單位(即

sizeof(類型))的。④兩個(gè)指針變量不能作加法運(yùn)算,只有當(dāng)

兩個(gè)指針變量指向同一數(shù)組時(shí),進(jìn)行指針變

量相減才有實(shí)際意義。如:p2-p1。2022/12/2611指針的關(guān)系運(yùn)算

注意指針的基本運(yùn)算404405406407408409410411412413a[0]a[1]a[2]a[3]a[4]3020104050p1p2①指向同一數(shù)組的兩個(gè)指針可以進(jìn)行關(guān)系

運(yùn)算,表明它們所指向元素的相互位置關(guān)系。

如:p2>p1、p2==p1。②指針與一個(gè)整型數(shù)據(jù)進(jìn)行比較是沒有意

義的

。③不同類型指針變量之間比較是非法的。④

NULL可以與任何類型指針進(jìn)行==、!=

的關(guān)系運(yùn)算,用于判斷指針是否為空指針

。10.2變量的指針和指向變量的指針變量2022/12/261210.2.3指針變量作為函數(shù)參數(shù)

變量可以作為函數(shù)參數(shù),指針變量同樣可以作為函數(shù)參數(shù)。指針變量作為函數(shù)參數(shù)時(shí),同樣是從實(shí)參單向傳遞指針變量的內(nèi)容給形參,只是傳遞的內(nèi)容是一個(gè)地址值。可以通過這個(gè)地址值間接改變實(shí)參、形參所共同指向的變量。也就是通過改變地址所指向的變量。10.2變量的指針和指向變量的指針變量2022/12/2613voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}main(){inta,b;int*pa,*pb;scanf(“%d,%d”,&a,&b);pa=&a;pb=&b;if(a<b)swap(pa,pb);printf("swaped:\n");printf("a=%d,b=%d\n",*pa,*pb);}函數(shù)參數(shù)使用指針變量,在函數(shù)中交換指針變量所指向的變量的值情況。采用指針變量作為函數(shù)參數(shù)實(shí)現(xiàn)例10.12022/12/2614voidswap(int*p1,int*p2){inttemp;temp=p1;p1=p2;p2=temp;}main(){inta,b;int*pa,*pb;scanf(“%d,%d”,&a,&b);pa=&a;pb=&b;if(a<b)swap(pa,pb);printf("swaped:\n");printf("a=%d,b=%d\n",*pa,*pb);}錯(cuò)誤方法之一2022/12/2615voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}main(){inta,b;int*pa,*pb;scanf(“%d,%d”,&a,&b);pa=&a;pb=&b;if(a<b)swap(pa,pb);printf("swaped:\n");printf("a=%d,b=%d\n",*pa,*pb);}錯(cuò)誤方法之二2022/12/2616⑴數(shù)組名是該數(shù)組的指針

a是數(shù)組的首地址(即a[0]的地址),是一

個(gè)指針常量。

a=&a[0],a+1=&a[1],…,a+9=&a[9]

數(shù)組元素的下標(biāo)表示法:

a[0],a[1],…,a[i],…,a[9]數(shù)組元素的指針表示法:

*(a+0),*(a+1),

…,*(a+i),…,*(a+9)10.3指針與數(shù)組10.3.1~10.3.3指向數(shù)組的指針1.一維數(shù)組的指針

例如:inta[10],*p;

a[0]a[9]pa2022/12/2617當(dāng)p指向a[0]時(shí),用p表示數(shù)組元素下標(biāo)法:

p[0],p[1],…,p[i],…,p[9]指針法:*(p+0),*(p+1),

…,*(p+i),…,*(p+9)a[0]a[9]p10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針1.一維數(shù)組的指針

⑵指向一維數(shù)組元素的指針變量由于數(shù)組元素也是一個(gè)內(nèi)存變量,所以此類指針變量的定義和使用與指向變量的指針變量相同。例如:inta[10],*p;p=a;(或p=&a[0];)

a2022/12/2618a[0]a[9]pa【例10.3】用指針法輸出數(shù)組元素。main(){inta[10],i,*p;for(i=0;i<10;i++)scanf("%d",a+i);for(i=0;i<10;i++)printf("%4d",*(a+i));

printf("\n");for(p=a,i=0;i<10;i++)printf("%4d",*(p+i));

printf("\n");}10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針1.一維數(shù)組的指針

1234567891012345678910123456789102022/12/2619a[0]a[9]pa【例10.3】用指針法輸出數(shù)組元素。main(){inta[10],i,*p;for(p=a;p<a+10;p++)scanf("%d",p);for(p=a;p<a+10;p++)printf("%d",*p);printf("\n");

}1.一維數(shù)組的指針

1234567891010.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2620a[0]a[9]pa[1]......12345678910a數(shù)組名是地址,指向數(shù)組的指針變量存放的也是地址。

通過指針變量也可以引用數(shù)組元素。p

=

&a[0]

等效于p

=

a。數(shù)組名和指向數(shù)組的指針變量的區(qū)別:指針變量p是變量可以賦值,數(shù)組名a是地址常量不能賦值。用指針變量引用數(shù)組元素,

必須關(guān)注其當(dāng)前值。例如:

p=p+3*(p-1)、p[-1]等價(jià)于a[2]10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2621【例10.4】輸入五個(gè)整數(shù),使用指針變量將這五個(gè)數(shù)

按從小到大排序后輸出。main(){inta[5],*pp,*p,*q,t;for(p=a;p<a+5;p++)scanf("%d",p);for(p=a;p<a+4;p++){pp=p;for(q=p+1;q<a+5;q++)if(*pp>*q)pp=q;if(pp!=p){t=*p;*p=*pp;*pp=t;}}for(p=a;p<a+5;p++)printf("%d",*p);printf("\n");}

輸入a數(shù)組

for(p=a;p<a+4;p++)pp=pfor(q=p+1;q<a+5;q++)T*pp>*qFpp=qTpp!=pF*pp*p

輸出a數(shù)組圖10.9選擇法排序N-S圖10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/262201020111212122231323a⑴二維數(shù)組的地址例如:inta[3][4];

二維數(shù)組名a是數(shù)組的首地址。

②二維數(shù)組a包含三個(gè)行元素:a[0]、a[1]、a[2]

。a[0]a[1]a[2]a三個(gè)行元素的地址分別是:a、a+1、a+2。而a[0]、a[1]、a[2]也是地址量,是一維數(shù)組名,即*(a+0)、*(a+1)、*(a+2)是一維數(shù)組首個(gè)元素地址。2.二維數(shù)組的指針

a+1a+210.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2623⑵二維數(shù)組元素的地址

a[0]、a[1]、a[2]是一維數(shù)組名,所以a[i]+j是數(shù)組元素的地址。數(shù)組元素a[i][j]的地址可以表示為下列形式:

&a[i][j]、a[i]+j

、*(a+i)+j01020111212122231323a[0]數(shù)組a[1]數(shù)組a[2]數(shù)組2.二維數(shù)組的指針

a[2]+1a[2]+2a[2]+3a[0]+1a[0]+2a[0]+310.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2624⑶二維數(shù)組元素的表示法

數(shù)組元素可用下列形式表示:

a[i][j]、*(a[i]+j)、*(*(a+i)+j)2.二維數(shù)組的指針

a

是二維數(shù)組,根據(jù)C的地址計(jì)算方法,a經(jīng)過兩次

*

操作才能訪問到數(shù)組元素。所以

*

a是

a[0],*

*

a才是a[0][0]。

a[0]是a[0][0]的地址,*a[0]是a[0][0]。01020111212122231323a[0]a[1]a[2]a10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2625⑷指向二維數(shù)組元素的指針變量2.二維數(shù)組的指針

【例10.5】用指向數(shù)組元素的指針變量輸出數(shù)組元素。main(){inta[3][4]={{0,1,2,3},{10,11,12,13},{20,21,22,23}},i,j,*p;for(p=a[0],i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",*(p+i*4+j));/*元素的相對(duì)位置為i*4+j*/printf("\n");}}這種指針變量的定義及使用與指向一維數(shù)組元素的

指針變量是相同的,用它存放二維數(shù)組元素的地址。01020111212122231323ap10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2626⑸指向一維數(shù)組的指針變量

指向一維數(shù)組指針變量的定義形式:數(shù)據(jù)類型標(biāo)識(shí)符(*變量名)[元素個(gè)數(shù)]2.二維數(shù)組的指針

“*”表示其后的變量名為指針類型,[元素個(gè)數(shù)]表示目標(biāo)變量是一維數(shù)組,并說明一維數(shù)組元素的個(gè)數(shù)。由于“*”比“[]”的運(yùn)算級(jí)別低,“*變量名”作為一個(gè)說明部分,兩邊必須加括號(hào)?!皵?shù)據(jù)類型標(biāo)識(shí)符”是定義一維數(shù)組元素的類型。10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2627【例10.6】用指向一維數(shù)組的指針變量輸出數(shù)組元素。main(){inta[3][4]={{0,1,2,3},{10,11,12,13},{20,21,22,23}};int(*lp)[4],i,j;for(lp=a,i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",*(*(lp+i)+j));printf("\n");}}2.二維數(shù)組的指針

01020111212122231323alplp+1lp+2

0123

10111213

2021222310.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2022/12/2628【例10.6】用指向一維數(shù)組的指針變量輸出數(shù)組元素。main(){inta[][4]={0,1,2,3,10,11,12,13,20,21,22,23};int(*lp)[4],j;for(lp=a;lp<a+3;lp++){for(j=0;j<4;j++)printf("%4d",*(*lp+j));printf("\n");}}10.3指針與數(shù)組10.3.1~10.3.4指向數(shù)組的指針2.二維數(shù)組的指針

01020111212122231323alplplplp

0123

10111213

20212223

2022/12/2629【例10.7】通過初始化使指針指向一個(gè)字符串。main(){charstr1[]="Goodmorning!";

char*str2="Goodnight!";

printf("%s\n",str1);printf("%s\n",str2);}10.4字符串與指針1.指向字符串的指針變量的定義及初始化

字符串的兩種表示方式:字符數(shù)組表示方式,字符串存放在一維數(shù)組中,引用時(shí)用數(shù)組名。字符指針變量表示方式,字符指針變量存放字符串的首地址,引用時(shí)用指針變量名。Goodmorning!Goodnight!2022/12/2630【例10.8】通過賦值運(yùn)算使字符指針變量指向一個(gè)字符串。#include<string.h>main(){charc[80],*str;strcpy(c,"Howareyou?");str="Fine,thanks.";printf("%s\n%s\n",c,str);}10.4字符串與指針2.字符串的賦值運(yùn)算

將一個(gè)字符串賦給一個(gè)字符數(shù)組只能使用strcpy函數(shù)將字符串常量的首地址賦給指針變量,可使用賦值運(yùn)算符“=”Howareyou?Fine,thanks.2022/12/2631【例10.9】利用指針變量輸入輸出字符串。#include<stdio.h>main(){charc[80],*str;str=c;gets(str);puts(str);}10.4字符串與指針3.字符串的輸入輸出

使用字符串輸入輸出函數(shù)gets和puts;在scanf和printf函數(shù)中使用%s格式實(shí)現(xiàn)。輸入字符串時(shí),函數(shù)參數(shù):數(shù)組名、存有數(shù)組名的指針變量;輸出字符串時(shí),函數(shù)參數(shù):數(shù)組名、存有字符串首地址的指針變量。IloveChina!

IloveChina!

2022/12/2632【例10.11】已知字符串str,從中截取一子串。要求

該子串是從str的第m個(gè)字符開始,由n個(gè)字符組成。思路:定義字符數(shù)組c存放子串,字符指針變量p用于復(fù)制

子串,利用循環(huán)語句從字符串str截取n個(gè)字符。考慮到幾種特殊情況:①m位置后的字符數(shù)有可能不足n個(gè),所以在循環(huán)讀取字符時(shí),若讀到‘\0’停止截取,利用break語句跳出循環(huán)。②輸入的截取位置m大于字符串的長度,則子串為空。③要求輸入的截取位置和字符個(gè)數(shù)均大于0,否則子串為空。10.4字符串與指針2022/12/2633main(){charc[80],*p,*str="Thisisastring.";inti,m,n;printf("m,n=");scanf("%d,%d",&m,&n);if(m>strlen(str)||n<=0||m<=0)

printf("NULL\n");else{for(p=str+m-1,i=0;i<n;i++)

if(*p)c[i]=*p++;elsebreak;/*如讀取到'\0'則停止循環(huán)*/

c[i]='\0';/*在c數(shù)組中加上子串結(jié)束標(biāo)志*/

printf("%s\n",c);}}10.4字符串與指針從m位置讀取n個(gè)字符送到c數(shù)組

要求位置m和長度n大于0

2022/12/263410.5、10.6指針與函數(shù)1指針變量作函數(shù)參數(shù)1.變量的指針作函數(shù)參數(shù)

【例10.17】輸入3個(gè)整數(shù),按從小到大順序輸出。voidswap(int*x1,int*x2){intt;t=*x1;*x1=*x2;*x2=t;return;}voidmain(){inta,b,c;scanf("%d%d%d",&a,&b,&c);if(a>b)swap(&a,&b);if(a>c)swap(&a,&c);if(b>c)swap(&b,&c);printf("%d,%d,%d\n",a,b,c);}7595,7,97a5b9c&ax1&bx2主調(diào)函數(shù)與被調(diào)函數(shù)之間數(shù)據(jù)傳遞的方法:①實(shí)參與形參之間的數(shù)據(jù)傳遞;②被調(diào)函數(shù)通過return語句把函數(shù)值返回到主調(diào)函數(shù);③通過全局變量交換數(shù)據(jù);④利用指針型參數(shù)在主調(diào)函數(shù)和被調(diào)函數(shù)之間傳遞數(shù)據(jù)。

7t797575形參x1和x2得到main函數(shù)中a和b的地址,這樣x1和x2的目標(biāo)變量就是main函數(shù)的變量a和b。在swap函數(shù)中交換*x1和*x2的內(nèi)容,就是交換a和b的內(nèi)容,所以當(dāng)函數(shù)調(diào)用結(jié)束后,盡管x1和x2已經(jīng)釋放,但操作結(jié)果仍保留在main函數(shù)的變量a和b中,這就是通過指針形參指向域擴(kuò)展到主調(diào)函數(shù)的方法,達(dá)到主調(diào)函數(shù)與被調(diào)函數(shù)間交換多個(gè)數(shù)據(jù)的目的。

2022/12/263510.5、10.6指針與函數(shù)2.數(shù)組的指針作函數(shù)參數(shù)

⑴一維數(shù)組的指針作函數(shù)參數(shù)例如被調(diào)函數(shù)abc的定義形式有以下三種:voidabc(intb[10]){……}voidabc(intb[]){……}voidabc(int*b){……}在主調(diào)函數(shù)有如下定義:inta[10],*p=a;則調(diào)用abc函數(shù)時(shí)可用abc(a)或

abc(p)當(dāng)函數(shù)之間需要傳遞數(shù)組時(shí),可以通過傳遞數(shù)組的首地址(即通過指針參數(shù)指向域的擴(kuò)展),完成存取主調(diào)函數(shù)中數(shù)組元素的操作。

2022/12/263610.5、10.6指針與函數(shù)2.數(shù)組的指針作函數(shù)參數(shù)

【例10.30】字符串復(fù)制函數(shù)。voidcopystr(char*t,char*s)

/*字符指針變量t和s作形參*/{while((*t++=*s++)!='\0');}main(){charc[80],*p="Iamastudent.";copystr(c,p);/*數(shù)組名c和字符指針變量p作實(shí)參*/

printf("%s\n",c);}2022/12/263710.5、10.6指針與函數(shù)2.數(shù)組的指針作函數(shù)參數(shù)

二維數(shù)組的指針作函數(shù)參數(shù)

由于指向二維數(shù)組的指針分為行指針和元素指針,所以他們作為函數(shù)參數(shù)的形式也不同。

二維數(shù)組的行指針作函數(shù)參數(shù)例如被調(diào)函數(shù)abc的定義形式有以下三種:voidabc(intb[2][4]){……}voidabc(intb[][4]){……}voidabc(int(*b)[4]){……}在主調(diào)函數(shù)有如下定義:inta[2][4],(*p)[4]=a;則調(diào)用abc函數(shù)時(shí)可用abc(a)或

abc(p)2022/12/2638【例10.22】用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為行指針。voidinarr(int(*p1)[4],intm)/*可改寫為voidinarr(intp1[][4],intm)*/{inti,j;for(i=0;i<m;i++)for(j=0;j<4;j++)scanf("%d",*(p1+i)+j);}voidoutarr(int(*p2)[4],intm)/*可改寫為voidoutarr(intp2[3][4],intm)*/{inti,j;for(i=0;i<m;i++){for(j=0;j<4;j++)printf("%6d",p2[i][j]);printf("\n");}}main(){inta[3][4],(*p)[4];p=a;inarr(a,3);outarr(p,3);}10.5、10.6指針與函數(shù)2.數(shù)組的指針作函數(shù)參數(shù)

2022/12/263910.5、10.6指針與函數(shù)2.數(shù)組的指針作函數(shù)參數(shù)

二維數(shù)組的指針作函數(shù)參數(shù)

②指向二維數(shù)組元素的指針作函數(shù)參數(shù)指向二維數(shù)組元素的指針作函數(shù)參數(shù)時(shí),是利用二維數(shù)組元素按行連續(xù)存儲(chǔ)的的特點(diǎn),訪問數(shù)組的每一個(gè)元素。被調(diào)函數(shù)的形參必須定義為指向二維數(shù)組元素的指針變量。例如被調(diào)函數(shù)abc的定義形式如下:voidabc(int*b){……}在主調(diào)函數(shù)有如下定義:inta[2][4],*p=a[0];則調(diào)用abc函數(shù)時(shí)可用abc(a[0])、abc(&a[0][0])或

abc(p)2022/12/2640【例10.23】用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為指向二維數(shù)組元素的指針。voidinarr(int*p1,intm,intn){inti,j;for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%d",p1+n*i+j);}10.5、10.6指針與函數(shù)voidoutarr(int*p1,intm,intn){inti,j;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%6d",*(p1+n*i+j));printf("\n");}}2.數(shù)組的指針作函數(shù)參數(shù)

main(){inta[3][4],*p;p=&a[0][0];inarr(a[0],3,4);outarr(p,3,4);}2022/12/264110.5、10.6指針與函數(shù)3、帶參數(shù)的主函數(shù)帶參數(shù)的主函數(shù)的定義

main(intargc,char*argv[]){……}

main函數(shù)只能有兩個(gè)形參,并且這兩個(gè)形參的類型也是固定的。第一個(gè)形參必須是整型變量,第二個(gè)形參可以定義為字符型指針數(shù)組,也可以定義為二級(jí)字符指針變量,因此也可以寫成

main(intargc,char**argv)2022/12/264210.5、10.6指針與函數(shù)3、帶參數(shù)的主函數(shù)帶參數(shù)的主函數(shù)的調(diào)用

帶參數(shù)的主函數(shù)調(diào)用形式:可執(zhí)行文件名參數(shù)1參數(shù)2……參數(shù)n在DOS系統(tǒng)提示符下鍵入的這一行字符稱為命令行??蓤?zhí)行文件名稱為命令名,其后的參數(shù)稱為命令行參數(shù),命令名與各參數(shù)之間用空格進(jìn)行分隔。要調(diào)用帶參數(shù)的主函數(shù)必須在操作系統(tǒng)環(huán)境下進(jìn)行。假設(shè)C語言源程序文件file1.c,經(jīng)過編譯、連接生成一個(gè)可執(zhí)行文件file1.exe。在DOS系統(tǒng)提示符后鍵入可執(zhí)行文件名file1,即可執(zhí)行該程序。2022/12/264310.5、10.6指針與函數(shù)3、帶參數(shù)的主函數(shù)主函數(shù)參數(shù)的作用

argc稱作參數(shù)計(jì)數(shù)器,它的值是包括命令名在內(nèi)的參數(shù)個(gè)數(shù)。argv指針數(shù)組的作用是存放命令行中命令名和每個(gè)參數(shù)字符串的首地址。C:\>file1onetwothreeargv[0]file1\0argv[1]one\0argv[2]two\0argv[3]three\0argvargc42022/12/2644C:\>10.5、10.6指針與函數(shù)3.帶參數(shù)的主函數(shù)【例10.24】顯示命令行參數(shù)程序。voidmain(intargc,char*argv[]){inti=0;while(--argc>0)printf("%s\n",argv[++i]);}file1onetwothree

onetwothree注意:命令行參數(shù)所傳送的數(shù)據(jù)全部都是字符串。即便傳送的是數(shù)值,也是按字符串方式傳送給主函數(shù)。程序中使用這些參數(shù)時(shí),還需要將數(shù)字字符串轉(zhuǎn)換成數(shù)值型數(shù)據(jù)。C語言標(biāo)準(zhǔn)庫函數(shù)提供了一些相關(guān)的數(shù)據(jù)類型轉(zhuǎn)換函數(shù)。2022/12/264510.5、10.6指針與函數(shù)4、指針型函數(shù)1.指針型函數(shù)的定義

指針型函數(shù)定義的一般形式:數(shù)據(jù)類型標(biāo)識(shí)符*函數(shù)名(形式參數(shù)表){……}其中函數(shù)名前的“*”表示函數(shù)的返回值是一個(gè)指針類型,“數(shù)據(jù)類型標(biāo)識(shí)符”是指針?biāo)赶虻哪繕?biāo)變量的類型。如果一個(gè)函數(shù)的返回值是指針,則稱此函數(shù)為指針型函數(shù)。

2022/12/2646char*subcut(char*a,ints,intlen){staticcharsubstr[SIZE+1];/*substr用于存放子串*/

intn;char*ps;

ps=substr;if(s<1||s>strlen(a)||len<1)

printf("dataerror\n");/*數(shù)據(jù)錯(cuò),子串為空*/

elsefor(n=1,a+=s-1;n<=len&&*a!='\0';n++)

*ps++=*a++;

*ps='\0';/*復(fù)制結(jié)束加入字符串結(jié)束標(biāo)志*/

return(substr);}10.5、10.6指針與函數(shù)4、指針型函數(shù)【例10.26】編制一個(gè)函數(shù),其功能是從已知字符串中指定位置s開始截取一個(gè)長度為len的子串。思路:在截取子串函數(shù)sutcut中需要從主調(diào)函數(shù)傳送3個(gè)數(shù)據(jù),源字符串、截取位置s、長度len。在形參中定義一個(gè)指針變量a接收源字符串的首地址,在函數(shù)中再定義一個(gè)存儲(chǔ)類型為static的字符數(shù)組substr用于存放子串,指針變量ps指向substr數(shù)組。在截取子串的過程中,如果起始位置s小于1或大于源串則子串為空,如果截取長度len小于1子串也為空;否則循環(huán)復(fù)制子串,直到復(fù)制了len個(gè)字符或從源串讀到

'\0'

結(jié)束。最后函數(shù)將返回substr字符數(shù)組的首地址。若起始位置s小于1或大于源串或截取長度len小于1

從第s個(gè)字符開始,復(fù)制len個(gè)字符

2022/12/264710.5、10.6指針與函數(shù)4、指針型函數(shù)2.指針型函數(shù)定義時(shí)應(yīng)注意的問題

指針函數(shù)中return的返回值必須是與函數(shù)類型一致的指針。②

返回值必須是外部或靜態(tài)存儲(chǔ)類別的變量指針或數(shù)組指針,以保證主調(diào)函數(shù)能正確使用數(shù)據(jù)。

2022/12/264810.5、10.6指針與函數(shù)5、指向函數(shù)的指針1.函數(shù)指針變量的定義

函數(shù)指針變量定義的一般形式:數(shù)據(jù)類型標(biāo)識(shí)符

(*函數(shù)指針變量名)();

其中“*函數(shù)指針變量名”必須用圓括號(hào)括起來,否則就成為聲明一個(gè)指針型函數(shù)了。在定義中“(*函數(shù)指針變量名)”右側(cè)的括號(hào)“()”表示指針變量所指向的目標(biāo)是一個(gè)函數(shù),“數(shù)據(jù)類型標(biāo)識(shí)符”是定義指針變量所指向的函數(shù)的類型。例如:

int(*p)();/*p是一個(gè)指向整型函數(shù)的指針變量*/

float(*q)();/*q是一個(gè)指向單精度實(shí)型函數(shù)的指針變量*/在C語言中,函數(shù)名具有與數(shù)組名類似的特性,數(shù)組名代表數(shù)組的首地址,函數(shù)名代表函數(shù)的起始地址(即該函數(shù)的程序代碼段在內(nèi)存中所占用的存儲(chǔ)空間的首地址,也稱函數(shù)入口)。因此也可以把函數(shù)名賦給一個(gè)函數(shù)指針變量,使其成為指向該函數(shù)的指針變量。函數(shù)名則可以看成是函數(shù)指針常量。

2022/12/264910.5、10.6指針與函數(shù)5、指向函數(shù)的指針2.用函數(shù)指針變量調(diào)用函數(shù)

用函數(shù)指針變量調(diào)用函數(shù)的一般形式:

(*函數(shù)指針變量名)(實(shí)參表);

由于優(yōu)先級(jí)不同“*函數(shù)指針變量名”必須用圓括號(hào)括起來,表示間接調(diào)用指針變量所指向的函數(shù);右側(cè)括號(hào)中為傳遞到被調(diào)函數(shù)的實(shí)參。

函數(shù)指針與變量指針的共同之處是都可以做間接訪問。變量指針指向內(nèi)存的數(shù)據(jù)存儲(chǔ)區(qū),通過間接存取運(yùn)算訪問目標(biāo)變量;函數(shù)指針指向內(nèi)存的程序代碼存儲(chǔ)區(qū),通過間接存取運(yùn)算使程序流程轉(zhuǎn)移到指針?biāo)赶虻暮瘮?shù)入口,取出函數(shù)的機(jī)器指令并執(zhí)行函數(shù),完成函數(shù)的調(diào)用。

2022/12/265010.5、10.6指針與函數(shù)5、指向函數(shù)的指針main(

){intmax(

),a,b,c;/*聲明被調(diào)用的目標(biāo)函數(shù)max*/int(*p)(

);/*定義p為指向整型函數(shù)的指針變量*/p

=

max;/*用指針變量存儲(chǔ)函數(shù)入口地址*/scanf(“%d%d”,&a,&b);c=(*p)(a,b);/*用指針變量調(diào)用函數(shù)*/printf(“max=%d”,c);}max(intx,inty)/*函數(shù)名是函數(shù)的入口地址*/{if(x>y)return(x);elsereturn(y);}由于優(yōu)先級(jí)的問題,()是必須的目標(biāo)函數(shù)必須要事先聲明,

即使是整型函數(shù)也要聲明(*p)中()是必須的,實(shí)參表應(yīng)與函數(shù)的形參表一一對(duì)應(yīng)2022/12/2651將函數(shù)指針作為參數(shù),可在主調(diào)函數(shù)和被調(diào)函數(shù)之間將第三個(gè)函數(shù)作為參數(shù)傳遞,實(shí)現(xiàn)在被調(diào)函數(shù)中調(diào)用不同函數(shù)的目的,使被調(diào)函數(shù)成為通用函數(shù)。

函數(shù)指針作函數(shù)參數(shù)時(shí),形參一定要定義為指向函數(shù)的指針變量,實(shí)參則可以是函數(shù)名或指向函數(shù)的指針變量。

【例10.28】編制一個(gè)用弦截法求方程根的函數(shù),求解下列方程。x3-5x2+6x-30=02x3-4x2+3x-6=0

Yf(x)(x2,f(x2))0x1xx0x2X(x1,f(x1))

圖10.21弦截法求方程的根示意圖10.5、10.6指針與函數(shù)4、指向函數(shù)的指針3.函數(shù)指針作函數(shù)的參數(shù)

由直線方程推出公式:2022/12/265210.5、10.6指針與函數(shù)floatroot(float(*fun)(float)){floatx,x1,x2,y,y1,y2;do/*選定一個(gè)單調(diào)變化的區(qū)間*/{……}while(y1*y2>=0);do{x=(x1*y2-x2*y1)/(y2-y1);y=(*fun)(x);if(y*y1<0){x2=x;y2=y;}else{x1=x;y1=y;}}while(fabs(y)>=0.0001);returnx;}

選定一個(gè)單調(diào)變化的區(qū)間[x1,x2]

按公式計(jì)算x=(x1*y2-x2*y1)/(y2-y1)y=f(x)y*y1<0TFx2=xx1=xy2=yy1=ywhile(|y|>=1e-4)x為方程的根圖10.22弦截法求方程的根N-S圖

Yf(x)(x2,f(x2))0x1xx0x2X(x1,f(x1))

圖10.21弦截法求方程的根示意圖被積函數(shù)如何解決root函數(shù)適用于不同的被積函數(shù)?通過指向函數(shù)的指針變量調(diào)用函數(shù)f(x);不可用固定函數(shù)名2022/12/265310.5、10.6指針與函數(shù)#include<math.h>voidmain(){floatf1(float),f2(float),root(float(*)(float));floatx1,x2;x1=root(f1);/*函數(shù)名f1作實(shí)參*/

printf("Arootofthefirstequation:%10.4f\n",x1);x2=root(f2);/*函數(shù)名f2作實(shí)參*/

printf("Arootofthesecondequation:%8.4f\n",x2);}floatf1(floatx){return(x*x*x-5*x*x+6*x-30);}floatf2(floatx){return(2*x*x*x-4*x*x+3*x-6);}對(duì)被調(diào)函數(shù)的聲明

2022/12/2654指針數(shù)組定義的一般形式:數(shù)據(jù)類型標(biāo)識(shí)符

*數(shù)組名[元素個(gè)數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論