C語(yǔ)言指針解讀課件_第1頁(yè)
C語(yǔ)言指針解讀課件_第2頁(yè)
C語(yǔ)言指針解讀課件_第3頁(yè)
C語(yǔ)言指針解讀課件_第4頁(yè)
C語(yǔ)言指針解讀課件_第5頁(yè)
已閱讀5頁(yè),還剩75頁(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)介

C程序設(shè)計(jì)中使用指針可以:

使程序簡(jiǎn)潔、緊湊、高效有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)分配內(nèi)存第6章指針2023/1/41C程序設(shè)計(jì)中使用指針可以:第6章指針2022/12/2616.1指針和變量在計(jì)算機(jī)中,內(nèi)存中的每一個(gè)字節(jié)的內(nèi)存單元都有一個(gè)編號(hào),這個(gè)編號(hào)就是“地址”,對(duì)于有多個(gè)字節(jié)的變量,第一個(gè)字節(jié)的地址就是該變量的地址。如果有:shortintx=5;設(shè)系統(tǒng)為x分配的地址為2000,則:

x20005p

20022000注意:區(qū)分變量的地址和變量的值2023/1/426.1指針和變量在計(jì)算機(jī)中,內(nèi)存中的每一個(gè)字節(jié)的內(nèi)存變量的指針:就是變量的地址。指針變量:存放變量地址的變量。定義指針變量的一般形式為:基類型*變量名;其中基類型用來(lái)指定該指針變量所指向的變量的類型。例如:

float*p;/*定義p為指向?qū)嵭妥兞康闹羔?/int*q;/*定義q為指向整形變量的指針*/char*s;/*定義s為指向字符型變量的指針*/2023/1/43變量的指針:就是變量的地址。2022/12/263charx=‘A’;char*p;p=&x;注意:指針變量只能存放具有基本類型的變量的地址。4000pAxA4000H4001H2023/1/44charx=‘A’;char*p;p=&x;注意:指針與指針相關(guān)的運(yùn)算符:⑴

&:取地址運(yùn)算符,其作用是求變量的地址。取地址運(yùn)算符具有右結(jié)合性,其優(yōu)先級(jí)和自加運(yùn)算符相同2。⑵*:指針運(yùn)算符,或稱“間接訪問(wèn)”運(yùn)算符。指針運(yùn)算符也具有右結(jié)合性,優(yōu)先級(jí)為2。2023/1/45與指針相關(guān)的運(yùn)算符:2022/12/265【例1】

main(){inta=3;int*p;p=&a;printf(“a=%d,*p=%d”,a,*p); printf(“*&a=%d”,*&a); printf(“*&*p=%d”,*&*p);}

2023/1/46【例1】2022/12/266【例2】用指針的方法交換兩個(gè)數(shù)

main(){intx=102,y=12,t; int*p1,*p2; p1=&x; p2=&y; printf(“x=%d,y=%d”,x,y); t=*p1; *p1=*p2; *p2=t; printf(“x=%d,y=%d”,x,y);}

2023/1/47【例2】用指針的方法交換兩個(gè)數(shù)2022/12/267例main(){inti=10;int*p;*p=i;printf("%d",*p);}例

main(){inti=10,k;int*p;

p=&k;*p=i;printf("%d",*p);}指針變量必須先賦值,再使用錯(cuò)誤正確2023/1/48例main()例main()指針變量必須6.2指針與數(shù)組6.2.1指向數(shù)組的指針1.一維數(shù)組的指針例如:inta[10],*p;p=&a[0];

a是數(shù)組名,代表一維數(shù)組的首地址。

*(a+i)=a[i]p=a;*(p+i)=p[i]=a[i]2023/1/496.2指針與數(shù)組6.2.1指向數(shù)組的指針1.一維數(shù)組的a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?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");}1.一維數(shù)組的指針

12345677910

12345677910123456779102023/1/410a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?shù)組元素。1.一維a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?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ù)組的指針

123456789102023/1/411a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?shù)組元素。1.一維數(shù)組名和指向數(shù)組的指針變量的區(qū)別:指針變量p是變量可以賦值,數(shù)組名a是地址常量不能賦值。用指針變量引用數(shù)組元素,

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

p=p+3*(p-1)等價(jià)于a[2]a[0]a[9]pa123456779102023/1/412數(shù)組名和指向數(shù)組的指針變量的區(qū)別:用指針變量引用數(shù)組元素,

【例4】用指針?lè)ㄇ笞址拈L(zhǎng)度main(){chars[30],*p;intn=0;

gets(s);p=s;while(*p!=‘\0’){p++;n++;}printf(“%d”,n);}ss[0]s[9]s[1]......china

go

On\0s[10]s[11]p2023/1/413【例4】用指針?lè)ㄇ笞址拈L(zhǎng)度ss[0]s[9]s[1]cs01020111212122231323a⑴二維數(shù)組的地址例如:inta[3][4];

①二維數(shù)組名a是數(shù)組的首地址。②二維數(shù)組a包含三個(gè)行元素:a[0]、a[1]、a[2]

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

a[0]、a[1]、a[2]是一維數(shù)組名,所以a[i]+j是數(shù)組元素的地址。數(shù)組元素a[i][j]的地址可以表示為下列形式:&a[i][j]、a[i]+j、*(a+i)+ja[0]數(shù)組a[1]數(shù)組a[2]數(shù)組2.二維數(shù)組的指針01020111212122231323a[2]+1a[2]+2a[2]+3a[0]+1a[0]+2a[0]+3⑶數(shù)組元素可用下列形式表示:

a[i][j]、*(a[i]+j)、*(*(a+i)+j)2023/1/415⑵二維數(shù)組元素的地址數(shù)組元素a[i][j]的地址可以表示(4)指向一維數(shù)組的指針變量指向一維數(shù)組指針變量的定義形式:

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

“*”表示其后的變量名為指針類型,[元素個(gè)數(shù)]表示目標(biāo)變量是一維數(shù)組,并說(shuō)明一維數(shù)組元素的個(gè)數(shù)。由于“*”比“[]”的運(yùn)算級(jí)別低,“*變量名”作為一個(gè)說(shuō)明部分,兩邊必須加括號(hào)。“數(shù)據(jù)類型標(biāo)識(shí)符”是定義一維數(shù)組元素的類型。2023/1/416(4)指向一維數(shù)組的指針變量2.二維數(shù)組的指針“*”【例5】用指向一維數(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");}}lplp+1lp+2

0123

10111213

2021222301020111212122231323a2023/1/417【例5】用指向一維數(shù)組的指針變量輸出數(shù)組元素。lplp+1l【例5】用指向一維數(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");}}lplplp01020111212122231323a

0123

10111213

20212223lp2023/1/418【例5】用指向一維數(shù)組的指針變量輸出數(shù)組元素。lplplp0【例6】通過(guò)初始化使指針指向一個(gè)字符串。main(){charstr1[]="Goodmorning!";

char*str2="Goodnight!";

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

字符串的兩種表示方式:

字符數(shù)組表示方式,字符串存放在一維數(shù)組中,引用時(shí)用數(shù)組名。

字符指針變量表示方式,字符指針變量存放字符串的首地址,引用時(shí)用指針變量名。Goodmorning!Good

night!2023/1/419【例6】通過(guò)初始化使指針指向一個(gè)字符串。6.2.2指向字符【例7】通過(guò)賦值運(yùn)算使字符指針變量指向一個(gè)字符串。#include<string.h>main(){charc[70],*str;strcpy(c,"Howareyou?");str="Fine,thanks.";printf("%s\n%s\n",c,str);}2.字符串的賦值運(yùn)算

將一個(gè)字符串賦給一個(gè)字符數(shù)組只能使用strcpy函數(shù)將字符串常量的首地址賦給指針變量,可使用賦值運(yùn)算符“=”

Howareyou?Fine,thanks.2023/1/420【例7】通過(guò)賦值運(yùn)算使字符指針變量指向一個(gè)字符串。2.字符【例8】利用指針變量輸入輸出字符串。#include<stdio.h>main(){charc[70],*str;str=c;gets(str);puts(str);}3.字符串的輸入輸出

IloveChina!

IloveChina!

2023/1/421【例8】利用指針變量輸入輸出字符串。3.字符串的輸入輸出指針數(shù)組定義的一般形式:

數(shù)據(jù)類型標(biāo)識(shí)符*數(shù)組名[元素個(gè)數(shù)];

在這個(gè)定義中由于“[]”比“*”的優(yōu)先級(jí)高,所以數(shù)組名先與“[元素個(gè)數(shù)]”結(jié)合,形成數(shù)組的定義形式,“*”表示數(shù)組中每個(gè)元素是指針類型,“數(shù)據(jù)類型標(biāo)識(shí)符”說(shuō)明指針的目標(biāo)變量的數(shù)據(jù)類型。例如:int*ip[10];char*cp[5];6.2.3指針數(shù)組1.指針數(shù)組的定義

指針數(shù)組就是數(shù)組中的每個(gè)元素均為指針類型

2023/1/422指針數(shù)組定義的一般形式:6.2.3指針數(shù)組1.指針數(shù)組的例如:char*str[5]={"int","long","char","float","double"};6.2.3指針數(shù)組2.指針數(shù)組初始化

str[4]str[3]str[2]str[1]str[0]\0elbuod\0taolf\0rahc\0gnol\0tni2023/1/423例如:6.2.3指針數(shù)組2.指針數(shù)組初始化str[4]【例9】用0--6分別代表星期日至星期六,當(dāng)輸入其中任意

一個(gè)數(shù)字時(shí),輸出相應(yīng)英文單詞。main(){char*weekname[7]={"Sunday","Monday","Tuesday",

"Wednesday","Thursday","Friday","Saturday"};intweek;printf("EnterweekNo.:");scanf("%d",&week);if(week>=0&&week<7)

printf("weekNo.%d——%s\n",week,weekname[week]);}6.2.3指針數(shù)組3.利用字符指針數(shù)組處理多個(gè)字符串

利用字符指針數(shù)組處理長(zhǎng)度不等的字符串,可節(jié)省存儲(chǔ)空間。

2023/1/424【例9】用0--6分別代表星期日至星期六,當(dāng)輸入其中任意

指針變量中存放的是普通變量的地址,但作為變量它也有自己的存儲(chǔ)地址,要存放指針變量存儲(chǔ)地址的變量也要是指針變量.由于存儲(chǔ)的是指針變量的地址,因此是指向指針的指針變量,或稱為二級(jí)指針變量.&pq&xp65x二級(jí)指針變量一級(jí)指針變量普通變量6.2.4多級(jí)指針1.二級(jí)指針變量的定義

2023/1/425指針變量中存放的是普通變量的地址,但作為變量它也有自己的指針的指針是指向指針數(shù)據(jù)的指針變量。也稱為二級(jí)指針.定義的一般形式為:char**q;

由于*運(yùn)算符的結(jié)合性是右結(jié)合的,因此**q相當(dāng)于*(*q),表示指針變量q是指向一個(gè)字符指針變量的。6.2.4多級(jí)指針1.二級(jí)指針變量的定義

2023/1/426指針的指針是指向指針數(shù)據(jù)的指針變量。也稱為二級(jí)指針.由【例10】使用指向指針的指針。main(){intx=65;int*p;int**q;p=&x;q=&p;printf(“x=%d,*p=%d,**q=%d”,x,*p,**q);}運(yùn)行結(jié)果為:x=65,*p=65,**q=652023/1/427【例10】使用指向指針的指針。運(yùn)行結(jié)果為:2022/12/2【例11】使用指向指針的指針。main(){ char*p[]={"teacher","book","pascal","hello","and","me"}; char**q;

intj;q=p; for(j=0;j<6;j++) {printf(“%s\n”,*q);q++;}}運(yùn)行結(jié)果為:teacherbookpascalhelloandme2023/1/428【例11】使用指向指針的指針。運(yùn)行結(jié)果為:2022/12/26.3指針與函數(shù)

返回值為指針的函數(shù)稱為指針類型函數(shù)。指針類型函數(shù)原型的一般形式:

類型名*函數(shù)名(參數(shù)類型表);說(shuō)明:類型名為函數(shù)返回的地址值的基類型。例如:int*a(intx,inty);float*b(floatn);char*str(charch);6.3.1返回指針值的函數(shù)2023/1/4296.3指針與函數(shù)返回值為指針的函數(shù)稱為指針類型函數(shù)。【例12】輸入一個(gè)1-7之間的整數(shù),輸出對(duì)應(yīng)的星期名.char*day_name(intn){char*name[]={“errorday”,”Monday”,”Tuesday”,“Wednesday”,”Thursday”,”Friday”,”Saturday”,”Sunday”};if(n<1||n>7)returnname[0];elsereturnname[n];}main(){inti;scanf(“%d”,&i);printf(“%d->%s”,i,day_name(i));}運(yùn)行結(jié)果為:2↙2->Tuesday2023/1/430【例12】輸入一個(gè)1-7之間的整數(shù),輸出對(duì)應(yīng)的星期名.運(yùn)行結(jié)

函數(shù)作為程序?qū)嶓w,在程序執(zhí)行前要將其代碼裝入內(nèi)存,占據(jù)內(nèi)存中的一段連續(xù)存儲(chǔ)區(qū)域,因此也有內(nèi)存地址。函數(shù)在內(nèi)存中一段連續(xù)的存儲(chǔ)區(qū)域的首字節(jié)編號(hào)叫函數(shù)的入口地址,又叫做函數(shù)指針.

在C語(yǔ)言中,函數(shù)指針用函數(shù)名表示,它是一個(gè)指針常量.可以定義指向函數(shù)的指針變量來(lái)接受函數(shù)指針,然后通過(guò)指向函數(shù)的指針變量來(lái)訪問(wèn)該函數(shù).

6.3.2指向函數(shù)的指針2023/1/431函數(shù)作為程序?qū)嶓w,在程序執(zhí)行前要將其代碼裝入內(nèi)存,占據(jù)內(nèi)存1、用指向函數(shù)的指針變量調(diào)用函數(shù)指向函數(shù)的指針變量一般定義形式為:

數(shù)據(jù)類型(*指針變量名)();

其中:數(shù)據(jù)類型是指函數(shù)值的返回類型。例:int(*p)();注意:int(*p)()和int*p()的區(qū)別函數(shù)的調(diào)用可以通過(guò)函數(shù)名調(diào)用,也可以通過(guò)函數(shù)指針調(diào)用(即用指向函數(shù)的指針變量調(diào)用)。6.3.2指向函數(shù)的指針2023/1/4321、用指向函數(shù)的指針變量調(diào)用函數(shù)6.3.2指向函數(shù)的指針用指向函數(shù)的指針變量調(diào)用函數(shù)的步驟:定義指向函數(shù)的指針變量.給指針變量賦函數(shù)的入口地址(即函數(shù)名)調(diào)用函數(shù).

形式為:(*指針變量)(實(shí)參列表)6.3.2指向函數(shù)的指針2023/1/433用指向函數(shù)的指針變量調(diào)用函數(shù)的步驟:6.3.2指向函數(shù)的指【例13】指向函數(shù)的指針示例。

main(){intsum(intx,inty);int(*p)();inta,b,Result;

p=sum;scanf("%d%d",&a,&b);

result=(*p)(a,b);printf("Thesumis%d\n",Result);}intsum(intx,inty){intz;z=x+y;return(z);}2023/1/434【例13】指向函數(shù)的指針示例。2022/12/26342、指向函數(shù)的指針作函數(shù)參數(shù):有了函數(shù)指針,就可以實(shí)現(xiàn)整個(gè)函數(shù)在函數(shù)之間的傳遞,也就是函數(shù)名作為實(shí)參傳遞給其它函數(shù)。函數(shù)指針常見(jiàn)用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。6.3.2指向函數(shù)的指針2023/1/4352、指向函數(shù)的指針作函數(shù)參數(shù):6.3.2指向函數(shù)的指針2【例14】利用梯形法計(jì)算定積分

#include“math.h”floatintdgral(double(*funp(),floata,floatb){floats,h,y;intn,i;s=((*funp)(a)+(*funp)(b))/2.0;n=100;h=(b-a)/n;for(i=1;i<n;i++)s=s+(*funp)(a+i*h);y=s*h;return(y);}2023/1/436【例14】利用梯形法計(jì)算定積分#include“mamain(){floats1,s2,s3;s1=intdgral(sin,0.0,3.14159/2);s2=intdgral(cos,0.0,3.14159/2);s3=intdgral(f,0.0,2.0);printf(“%f,%f,%f”,s1,s2,s3);}doublef(doublex){return(sqrt(4-x*x);}2023/1/437main()doublef(doublex)2022/13、帶參數(shù)的main函數(shù)由于main函數(shù)不被其他函數(shù)調(diào)用,不需要從其他函數(shù)接收數(shù)據(jù),因此從函數(shù)調(diào)用角度來(lái)說(shuō),main函數(shù)不需要形式參數(shù).但是,c程序編譯連接形成可執(zhí)行程序后,要在dos提示符的狀態(tài)下運(yùn)行,此時(shí)可以接受命令行傳來(lái)的數(shù)據(jù),因此,C語(yǔ)言規(guī)定main函數(shù)也可以有形式參數(shù),而實(shí)參就是命令行的字符串.6.3.2指向函數(shù)的指針2023/1/4383、帶參數(shù)的main函數(shù)6.3.2指向函數(shù)的指針20223、帶參數(shù)的main函數(shù)包含形式參數(shù)的main函數(shù)的一般形式為:main(intargc,char*argv[])){….}說(shuō)明:字符型指針數(shù)組argv[]指向命令行輸入的若干個(gè)字符串,這些字符串以空格隔開(kāi).整型變量argc記載命令行字符串的個(gè)數(shù),也就是argv的元素個(gè)數(shù).63.2指向函數(shù)的指針2023/1/4393、帶參數(shù)的main函數(shù)63.2指向函數(shù)的指針2022/main(intargc,char*argv[]){printf(“argc=%d\n”,argc);while(argc>0){printf(“argv=%s\n”,*argv);argc--;argv++;}}6.3.2指向函數(shù)的指針2023/1/440main(intargc,char*argv[])6.C程序設(shè)計(jì)中使用指針可以:

使程序簡(jiǎn)潔、緊湊、高效有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)分配內(nèi)存第6章指針2023/1/441C程序設(shè)計(jì)中使用指針可以:第6章指針2022/12/2616.1指針和變量在計(jì)算機(jī)中,內(nèi)存中的每一個(gè)字節(jié)的內(nèi)存單元都有一個(gè)編號(hào),這個(gè)編號(hào)就是“地址”,對(duì)于有多個(gè)字節(jié)的變量,第一個(gè)字節(jié)的地址就是該變量的地址。如果有:shortintx=5;設(shè)系統(tǒng)為x分配的地址為2000,則:

x20005p

20022000注意:區(qū)分變量的地址和變量的值2023/1/4426.1指針和變量在計(jì)算機(jī)中,內(nèi)存中的每一個(gè)字節(jié)的內(nèi)存變量的指針:就是變量的地址。指針變量:存放變量地址的變量。定義指針變量的一般形式為:基類型*變量名;其中基類型用來(lái)指定該指針變量所指向的變量的類型。例如:

float*p;/*定義p為指向?qū)嵭妥兞康闹羔?/int*q;/*定義q為指向整形變量的指針*/char*s;/*定義s為指向字符型變量的指針*/2023/1/443變量的指針:就是變量的地址。2022/12/263charx=‘A’;char*p;p=&x;注意:指針變量只能存放具有基本類型的變量的地址。4000pAxA4000H4001H2023/1/444charx=‘A’;char*p;p=&x;注意:指針與指針相關(guān)的運(yùn)算符:⑴

&:取地址運(yùn)算符,其作用是求變量的地址。取地址運(yùn)算符具有右結(jié)合性,其優(yōu)先級(jí)和自加運(yùn)算符相同2。⑵*:指針運(yùn)算符,或稱“間接訪問(wèn)”運(yùn)算符。指針運(yùn)算符也具有右結(jié)合性,優(yōu)先級(jí)為2。2023/1/445與指針相關(guān)的運(yùn)算符:2022/12/265【例1】

main(){inta=3;int*p;p=&a;printf(“a=%d,*p=%d”,a,*p); printf(“*&a=%d”,*&a); printf(“*&*p=%d”,*&*p);}

2023/1/446【例1】2022/12/266【例2】用指針的方法交換兩個(gè)數(shù)

main(){intx=102,y=12,t; int*p1,*p2; p1=&x; p2=&y; printf(“x=%d,y=%d”,x,y); t=*p1; *p1=*p2; *p2=t; printf(“x=%d,y=%d”,x,y);}

2023/1/447【例2】用指針的方法交換兩個(gè)數(shù)2022/12/267例main(){inti=10;int*p;*p=i;printf("%d",*p);}例

main(){inti=10,k;int*p;

p=&k;*p=i;printf("%d",*p);}指針變量必須先賦值,再使用錯(cuò)誤正確2023/1/448例main()例main()指針變量必須6.2指針與數(shù)組6.2.1指向數(shù)組的指針1.一維數(shù)組的指針例如:inta[10],*p;p=&a[0];

a是數(shù)組名,代表一維數(shù)組的首地址。

*(a+i)=a[i]p=a;*(p+i)=p[i]=a[i]2023/1/4496.2指針與數(shù)組6.2.1指向數(shù)組的指針1.一維數(shù)組的a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?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");}1.一維數(shù)組的指針

12345677910

12345677910123456779102023/1/450a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?shù)組元素。1.一維a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?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ù)組的指針

123456789102023/1/451a[0]a[9]pa【例3】用指針?lè)ㄝ敵鰯?shù)組元素。1.一維數(shù)組名和指向數(shù)組的指針變量的區(qū)別:指針變量p是變量可以賦值,數(shù)組名a是地址常量不能賦值。用指針變量引用數(shù)組元素,

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

p=p+3*(p-1)等價(jià)于a[2]a[0]a[9]pa123456779102023/1/452數(shù)組名和指向數(shù)組的指針變量的區(qū)別:用指針變量引用數(shù)組元素,

【例4】用指針?lè)ㄇ笞址拈L(zhǎng)度main(){chars[30],*p;intn=0;

gets(s);p=s;while(*p!=‘\0’){p++;n++;}printf(“%d”,n);}ss[0]s[9]s[1]......china

go

On\0s[10]s[11]p2023/1/453【例4】用指針?lè)ㄇ笞址拈L(zhǎng)度ss[0]s[9]s[1]cs01020111212122231323a⑴二維數(shù)組的地址例如:inta[3][4];

①二維數(shù)組名a是數(shù)組的首地址。②二維數(shù)組a包含三個(gè)行元素:a[0]、a[1]、a[2]

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

a[0]、a[1]、a[2]是一維數(shù)組名,所以a[i]+j是數(shù)組元素的地址。數(shù)組元素a[i][j]的地址可以表示為下列形式:&a[i][j]、a[i]+j、*(a+i)+ja[0]數(shù)組a[1]數(shù)組a[2]數(shù)組2.二維數(shù)組的指針01020111212122231323a[2]+1a[2]+2a[2]+3a[0]+1a[0]+2a[0]+3⑶數(shù)組元素可用下列形式表示:

a[i][j]、*(a[i]+j)、*(*(a+i)+j)2023/1/455⑵二維數(shù)組元素的地址數(shù)組元素a[i][j]的地址可以表示(4)指向一維數(shù)組的指針變量指向一維數(shù)組指針變量的定義形式:

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

“*”表示其后的變量名為指針類型,[元素個(gè)數(shù)]表示目標(biāo)變量是一維數(shù)組,并說(shuō)明一維數(shù)組元素的個(gè)數(shù)。由于“*”比“[]”的運(yùn)算級(jí)別低,“*變量名”作為一個(gè)說(shuō)明部分,兩邊必須加括號(hào)。“數(shù)據(jù)類型標(biāo)識(shí)符”是定義一維數(shù)組元素的類型。2023/1/456(4)指向一維數(shù)組的指針變量2.二維數(shù)組的指針“*”【例5】用指向一維數(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");}}lplp+1lp+2

0123

10111213

2021222301020111212122231323a2023/1/457【例5】用指向一維數(shù)組的指針變量輸出數(shù)組元素。lplp+1l【例5】用指向一維數(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");}}lplplp01020111212122231323a

0123

10111213

20212223lp2023/1/458【例5】用指向一維數(shù)組的指針變量輸出數(shù)組元素。lplplp0【例6】通過(guò)初始化使指針指向一個(gè)字符串。main(){charstr1[]="Goodmorning!";

char*str2="Goodnight!";

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

字符串的兩種表示方式:

字符數(shù)組表示方式,字符串存放在一維數(shù)組中,引用時(shí)用數(shù)組名。

字符指針變量表示方式,字符指針變量存放字符串的首地址,引用時(shí)用指針變量名。Goodmorning!Good

night!2023/1/459【例6】通過(guò)初始化使指針指向一個(gè)字符串。6.2.2指向字符【例7】通過(guò)賦值運(yùn)算使字符指針變量指向一個(gè)字符串。#include<string.h>main(){charc[70],*str;strcpy(c,"Howareyou?");str="Fine,thanks.";printf("%s\n%s\n",c,str);}2.字符串的賦值運(yùn)算

將一個(gè)字符串賦給一個(gè)字符數(shù)組只能使用strcpy函數(shù)將字符串常量的首地址賦給指針變量,可使用賦值運(yùn)算符“=”

Howareyou?Fine,thanks.2023/1/460【例7】通過(guò)賦值運(yùn)算使字符指針變量指向一個(gè)字符串。2.字符【例8】利用指針變量輸入輸出字符串。#include<stdio.h>main(){charc[70],*str;str=c;gets(str);puts(str);}3.字符串的輸入輸出

IloveChina!

IloveChina!

2023/1/461【例8】利用指針變量輸入輸出字符串。3.字符串的輸入輸出指針數(shù)組定義的一般形式:

數(shù)據(jù)類型標(biāo)識(shí)符*數(shù)組名[元素個(gè)數(shù)];

在這個(gè)定義中由于“[]”比“*”的優(yōu)先級(jí)高,所以數(shù)組名先與“[元素個(gè)數(shù)]”結(jié)合,形成數(shù)組的定義形式,“*”表示數(shù)組中每個(gè)元素是指針類型,“數(shù)據(jù)類型標(biāo)識(shí)符”說(shuō)明指針的目標(biāo)變量的數(shù)據(jù)類型。例如:int*ip[10];char*cp[5];6.2.3指針數(shù)組1.指針數(shù)組的定義

指針數(shù)組就是數(shù)組中的每個(gè)元素均為指針類型

2023/1/462指針數(shù)組定義的一般形式:6.2.3指針數(shù)組1.指針數(shù)組的例如:char*str[5]={"int","long","char","float","double"};6.2.3指針數(shù)組2.指針數(shù)組初始化

str[4]str[3]str[2]str[1]str[0]\0elbuod\0taolf\0rahc\0gnol\0tni2023/1/463例如:6.2.3指針數(shù)組2.指針數(shù)組初始化str[4]【例9】用0--6分別代表星期日至星期六,當(dāng)輸入其中任意

一個(gè)數(shù)字時(shí),輸出相應(yīng)英文單詞。main(){char*weekname[7]={"Sunday","Monday","Tuesday",

"Wednesday","Thursday","Friday","Saturday"};intweek;printf("EnterweekNo.:");scanf("%d",&week);if(week>=0&&week<7)

printf("weekNo.%d——%s\n",week,weekname[week]);}6.2.3指針數(shù)組3.利用字符指針數(shù)組處理多個(gè)字符串

利用字符指針數(shù)組處理長(zhǎng)度不等的字符串,可節(jié)省存儲(chǔ)空間。

2023/1/464【例9】用0--6分別代表星期日至星期六,當(dāng)輸入其中任意

指針變量中存放的是普通變量的地址,但作為變量它也有自己的存儲(chǔ)地址,要存放指針變量存儲(chǔ)地址的變量也要是指針變量.由于存儲(chǔ)的是指針變量的地址,因此是指向指針的指針變量,或稱為二級(jí)指針變量.&pq&xp65x二級(jí)指針變量一級(jí)指針變量普通變量6.2.4多級(jí)指針1.二級(jí)指針變量的定義

2023/1/465指針變量中存放的是普通變量的地址,但作為變量它也有自己的指針的指針是指向指針數(shù)據(jù)的指針變量。也稱為二級(jí)指針.定義的一般形式為:char**q;

由于*運(yùn)算符的結(jié)合性是右結(jié)合的,因此**q相當(dāng)于*(*q),表示指針變量q是指向一個(gè)字符指針變量的。6.2.4多級(jí)指針1.二級(jí)指針變量的定義

2023/1/466指針的指針是指向指針數(shù)據(jù)的指針變量。也稱為二級(jí)指針.由【例10】使用指向指針的指針。main(){intx=65;int*p;int**q;p=&x;q=&p;printf(“x=%d,*p=%d,**q=%d”,x,*p,**q);}運(yùn)行結(jié)果為:x=65,*p=65,**q=652023/1/467【例10】使用指向指針的指針。運(yùn)行結(jié)果為:2022/12/2【例11】使用指向指針的指針。main(){ char*p[]={"teacher","book","pascal","hello","and","me"}; char**q;

intj;q=p; for(j=0;j<6;j++) {printf(“%s\n”,*q);q++;}}運(yùn)行結(jié)果為:teacherbookpascalhelloandme2023/1/468【例11】使用指向指針的指針。運(yùn)行結(jié)果為:2022/12/26.3指針與函數(shù)

返回值為指針的函數(shù)稱為指針類型函數(shù)。指針類型函數(shù)原型的一般形式:

類型名*函數(shù)名(參數(shù)類型表);說(shuō)明:類型名為函數(shù)返回的地址值的基類型。例如:int*a(intx,inty);float*b(floatn);char*str(charch);6.3.1返回指針值的函數(shù)2023/1/4696.3指針與函數(shù)返回值為指針的函數(shù)稱為指針類型函數(shù)。【例12】輸入一個(gè)1-7之間的整數(shù),輸出對(duì)應(yīng)的星期名.char*day_name(intn){char*name[]={“errorday”,”Monday”,”Tuesday”,“Wednesday”,”Thursday”,”Friday”,”Saturday”,”Sunday”};if(n<1||n>7)returnname[0];elsereturnname[n];}main(){inti;scanf(“%d”,&i);printf(“%d->%s”,i,day_name(i));}運(yùn)行結(jié)果為:2↙2->Tuesday2023/1/470【例12】輸入一個(gè)1-7之間的整數(shù),輸出對(duì)應(yīng)的星期名.運(yùn)行結(jié)

函數(shù)作為程序?qū)嶓w,在程序執(zhí)行前要將其代碼裝入內(nèi)存,占據(jù)內(nèi)存中的一段連續(xù)存儲(chǔ)區(qū)域,因此也有內(nèi)存地址。函數(shù)在內(nèi)存中一段連續(xù)的存儲(chǔ)區(qū)域的首字節(jié)編號(hào)叫函數(shù)的入口地址,又叫做函數(shù)指針.

在C語(yǔ)言中,函數(shù)指針用函數(shù)名表示,它是一個(gè)指針常量.可以定義指向函數(shù)的指針變量來(lái)接受函數(shù)指針,然后通過(guò)指向函數(shù)的指針變量來(lái)訪問(wèn)該函數(shù).

6.3.2指向函數(shù)的指針2023/1/471函數(shù)作為程序

溫馨提示

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