版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C程序設(shè)計中使用指針可以:
使程序簡潔、緊湊、高效有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動態(tài)分配內(nèi)存第6章指針2023/1/41C程序設(shè)計中使用指針可以:第6章指針2022/12/2616.1指針和變量在計算機(jī)中,內(nèi)存中的每一個字節(jié)的內(nèi)存單元都有一個編號,這個編號就是“地址”,對于有多個字節(jié)的變量,第一個字節(jié)的地址就是該變量的地址。如果有:shortintx=5;設(shè)系統(tǒng)為x分配的地址為2000,則:
x20005p
20022000注意:區(qū)分變量的地址和變量的值2023/1/426.1指針和變量在計算機(jī)中,內(nèi)存中的每一個字節(jié)的內(nè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)先級和自加運(yùn)算符相同2。⑵*:指針運(yùn)算符,或稱“間接訪問”運(yùn)算符。指針運(yùn)算符也具有右結(jié)合性,優(yōu)先級為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】用指針的方法交換兩個數(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】用指針的方法交換兩個數(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);}指針變量必須先賦值,再使用錯誤正確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】用指針法輸出數(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】用指針法輸出數(shù)組元素。1.一維a[0]a[9]pa【例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ù)組的指針
123456789102023/1/411a[0]a[9]pa【例3】用指針法輸出數(shù)組元素。1.一維數(shù)組名和指向數(shù)組的指針變量的區(qū)別:指針變量p是變量可以賦值,數(shù)組名a是地址常量不能賦值。用指針變量引用數(shù)組元素,
必須關(guān)注其當(dāng)前值。例如:
p=p+3*(p-1)等價于a[2]a[0]a[9]pa123456779102023/1/412數(shù)組名和指向數(shù)組的指針變量的區(qū)別:用指針變量引用數(shù)組元素,
【例4】用指針法求字符串的長度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】用指針法求字符串的長度ss[0]s[9]s[1]cs01020111212122231323a⑴二維數(shù)組的地址例如:inta[3][4];
①二維數(shù)組名a是數(shù)組的首地址。②二維數(shù)組a包含三個行元素:a[0]、a[1]、a[2]
。三個行元素的地址分別是:a、a+1、a+2。而a[0]、a[1]、a[2]也是地址量,是一維數(shù)組名,即*(a+0)、*(a+1)、*(a+2)是一維數(shù)組首個元素地址。2.二維數(shù)組的指針a[0]a[1]a[2]aa+1a+22023/1/4140123a⑴二維數(shù)組的地址三個行元素的地址分別是: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ù)]2.二維數(shù)組的指針
“*”表示其后的變量名為指針類型,[元素個數(shù)]表示目標(biāo)變量是一維數(shù)組,并說明一維數(shù)組元素的個數(shù)。由于“*”比“[]”的運(yùn)算級別低,“*變量名”作為一個說明部分,兩邊必須加括號。“數(shù)據(jù)類型標(biāo)識符”是定義一維數(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】通過初始化使指針指向一個字符串。main(){charstr1[]="Goodmorning!";
char*str2="Goodnight!";
printf("%s\n",str1);printf("%s\n",str2);}6.2.2指向字符串的指針變量1.指向字符串的指針變量的定義及初始化
字符串的兩種表示方式:
字符數(shù)組表示方式,字符串存放在一維數(shù)組中,引用時用數(shù)組名。
字符指針變量表示方式,字符指針變量存放字符串的首地址,引用時用指針變量名。Goodmorning!Good
night!2023/1/419【例6】通過初始化使指針指向一個字符串。6.2.2指向字符【例7】通過賦值運(yùn)算使字符指針變量指向一個字符串。#include<string.h>main(){charc[70],*str;strcpy(c,"Howareyou?");str="Fine,thanks.";printf("%s\n%s\n",c,str);}2.字符串的賦值運(yùn)算
將一個字符串賦給一個字符數(shù)組只能使用strcpy函數(shù)將字符串常量的首地址賦給指針變量,可使用賦值運(yùn)算符“=”
Howareyou?Fine,thanks.2023/1/420【例7】通過賦值運(yùn)算使字符指針變量指向一個字符串。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ù)];
在這個定義中由于“[]”比“*”的優(yōu)先級高,所以數(shù)組名先與“[元素個數(shù)]”結(jié)合,形成數(shù)組的定義形式,“*”表示數(shù)組中每個元素是指針類型,“數(shù)據(jù)類型標(biāo)識符”說明指針的目標(biāo)變量的數(shù)據(jù)類型。例如:int*ip[10];char*cp[5];6.2.3指針數(shù)組1.指針數(shù)組的定義
指針數(shù)組就是數(shù)組中的每個元素均為指針類型
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)輸入其中任意
一個數(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ù)組處理多個字符串
利用字符指針數(shù)組處理長度不等的字符串,可節(jié)省存儲空間。
2023/1/424【例9】用0--6分別代表星期日至星期六,當(dāng)輸入其中任意
一
指針變量中存放的是普通變量的地址,但作為變量它也有自己的存儲地址,要存放指針變量存儲地址的變量也要是指針變量.由于存儲的是指針變量的地址,因此是指向指針的指針變量,或稱為二級指針變量.&pq&xp65x二級指針變量一級指針變量普通變量6.2.4多級指針1.二級指針變量的定義
2023/1/425指針變量中存放的是普通變量的地址,但作為變量它也有自己的指針的指針是指向指針數(shù)據(jù)的指針變量。也稱為二級指針.定義的一般形式為:char**q;
由于*運(yùn)算符的結(jié)合性是右結(jié)合的,因此**q相當(dāng)于*(*q),表示指針變量q是指向一個字符指針變量的。6.2.4多級指針1.二級指針變量的定義
2023/1/426指針的指針是指向指針數(shù)據(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ù)類型表);說明:類型名為函數(shù)返回的地址值的基類型。例如:int*a(intx,inty);float*b(floatn);char*str(charch);6.3.1返回指針值的函數(shù)2023/1/4296.3指針與函數(shù)返回值為指針的函數(shù)稱為指針類型函數(shù)。【例12】輸入一個1-7之間的整數(shù),輸出對應(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】輸入一個1-7之間的整數(shù),輸出對應(yīng)的星期名.運(yùn)行結(jié)
函數(shù)作為程序?qū)嶓w,在程序執(zhí)行前要將其代碼裝入內(nèi)存,占據(jù)內(nèi)存中的一段連續(xù)存儲區(qū)域,因此也有內(nèi)存地址。函數(shù)在內(nèi)存中一段連續(xù)的存儲區(qū)域的首字節(jié)編號叫函數(shù)的入口地址,又叫做函數(shù)指針.
在C語言中,函數(shù)指針用函數(shù)名表示,它是一個指針常量.可以定義指向函數(shù)的指針變量來接受函數(shù)指針,然后通過指向函數(shù)的指針變量來訪問該函數(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)用可以通過函數(shù)名調(diào)用,也可以通過函數(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ù).
形式為:(*指針變量)(實參列表)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ù)指針,就可以實現(xiàn)整個函數(shù)在函數(shù)之間的傳遞,也就是函數(shù)名作為實參傳遞給其它函數(shù)。函數(shù)指針常見用途之一是把指針作為參數(shù)傳遞到其他函數(shù)。6.3.2指向函數(shù)的指針2023/1/4352、指向函數(shù)的指針作函數(shù)參數(shù):6.3.2指向函數(shù)的指針2【例14】利用梯形法計算定積分
#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】利用梯形法計算定積分#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)用角度來說,main函數(shù)不需要形式參數(shù).但是,c程序編譯連接形成可執(zhí)行程序后,要在dos提示符的狀態(tài)下運(yùn)行,此時可以接受命令行傳來的數(shù)據(jù),因此,C語言規(guī)定main函數(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[])){….}說明:字符型指針數(shù)組argv[]指向命令行輸入的若干個字符串,這些字符串以空格隔開.整型變量argc記載命令行字符串的個數(shù),也就是argv的元素個數(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è)計中使用指針可以:
使程序簡潔、緊湊、高效有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)動態(tài)分配內(nèi)存第6章指針2023/1/441C程序設(shè)計中使用指針可以:第6章指針2022/12/2616.1指針和變量在計算機(jī)中,內(nèi)存中的每一個字節(jié)的內(nèi)存單元都有一個編號,這個編號就是“地址”,對于有多個字節(jié)的變量,第一個字節(jié)的地址就是該變量的地址。如果有:shortintx=5;設(shè)系統(tǒng)為x分配的地址為2000,則:
x20005p
20022000注意:區(qū)分變量的地址和變量的值2023/1/4426.1指針和變量在計算機(jī)中,內(nèi)存中的每一個字節(jié)的內(nè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)先級和自加運(yùn)算符相同2。⑵*:指針運(yùn)算符,或稱“間接訪問”運(yùn)算符。指針運(yùn)算符也具有右結(jié)合性,優(yōu)先級為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】用指針的方法交換兩個數(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】用指針的方法交換兩個數(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);}指針變量必須先賦值,再使用錯誤正確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】用指針法輸出數(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】用指針法輸出數(shù)組元素。1.一維a[0]a[9]pa【例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ù)組的指針
123456789102023/1/451a[0]a[9]pa【例3】用指針法輸出數(shù)組元素。1.一維數(shù)組名和指向數(shù)組的指針變量的區(qū)別:指針變量p是變量可以賦值,數(shù)組名a是地址常量不能賦值。用指針變量引用數(shù)組元素,
必須關(guān)注其當(dāng)前值。例如:
p=p+3*(p-1)等價于a[2]a[0]a[9]pa123456779102023/1/452數(shù)組名和指向數(shù)組的指針變量的區(qū)別:用指針變量引用數(shù)組元素,
【例4】用指針法求字符串的長度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】用指針法求字符串的長度ss[0]s[9]s[1]cs01020111212122231323a⑴二維數(shù)組的地址例如:inta[3][4];
①二維數(shù)組名a是數(shù)組的首地址。②二維數(shù)組a包含三個行元素:a[0]、a[1]、a[2]
。三個行元素的地址分別是:a、a+1、a+2。而a[0]、a[1]、a[2]也是地址量,是一維數(shù)組名,即*(a+0)、*(a+1)、*(a+2)是一維數(shù)組首個元素地址。2.二維數(shù)組的指針a[0]a[1]a[2]aa+1a+22023/1/4540123a⑴二維數(shù)組的地址三個行元素的地址分別是: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ù)]2.二維數(shù)組的指針
“*”表示其后的變量名為指針類型,[元素個數(shù)]表示目標(biāo)變量是一維數(shù)組,并說明一維數(shù)組元素的個數(shù)。由于“*”比“[]”的運(yùn)算級別低,“*變量名”作為一個說明部分,兩邊必須加括號?!皵?shù)據(jù)類型標(biāo)識符”是定義一維數(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】通過初始化使指針指向一個字符串。main(){charstr1[]="Goodmorning!";
char*str2="Goodnight!";
printf("%s\n",str1);printf("%s\n",str2);}6.2.2指向字符串的指針變量1.指向字符串的指針變量的定義及初始化
字符串的兩種表示方式:
字符數(shù)組表示方式,字符串存放在一維數(shù)組中,引用時用數(shù)組名。
字符指針變量表示方式,字符指針變量存放字符串的首地址,引用時用指針變量名。Goodmorning!Good
night!2023/1/459【例6】通過初始化使指針指向一個字符串。6.2.2指向字符【例7】通過賦值運(yùn)算使字符指針變量指向一個字符串。#include<string.h>main(){charc[70],*str;strcpy(c,"Howareyou?");str="Fine,thanks.";printf("%s\n%s\n",c,str);}2.字符串的賦值運(yùn)算
將一個字符串賦給一個字符數(shù)組只能使用strcpy函數(shù)將字符串常量的首地址賦給指針變量,可使用賦值運(yùn)算符“=”
Howareyou?Fine,thanks.2023/1/460【例7】通過賦值運(yùn)算使字符指針變量指向一個字符串。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ù)];
在這個定義中由于“[]”比“*”的優(yōu)先級高,所以數(shù)組名先與“[元素個數(shù)]”結(jié)合,形成數(shù)組的定義形式,“*”表示數(shù)組中每個元素是指針類型,“數(shù)據(jù)類型標(biāo)識符”說明指針的目標(biāo)變量的數(shù)據(jù)類型。例如:int*ip[10];char*cp[5];6.2.3指針數(shù)組1.指針數(shù)組的定義
指針數(shù)組就是數(shù)組中的每個元素均為指針類型
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)輸入其中任意
一個數(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ù)組處理多個字符串
利用字符指針數(shù)組處理長度不等的字符串,可節(jié)省存儲空間。
2023/1/464【例9】用0--6分別代表星期日至星期六,當(dāng)輸入其中任意
一
指針變量中存放的是普通變量的地址,但作為變量它也有自己的存儲地址,要存放指針變量存儲地址的變量也要是指針變量.由于存儲的是指針變量的地址,因此是指向指針的指針變量,或稱為二級指針變量.&pq&xp65x二級指針變量一級指針變量普通變量6.2.4多級指針1.二級指針變量的定義
2023/1/465指針變量中存放的是普通變量的地址,但作為變量它也有自己的指針的指針是指向指針數(shù)據(jù)的指針變量。也稱為二級指針.定義的一般形式為:char**q;
由于*運(yùn)算符的結(jié)合性是右結(jié)合的,因此**q相當(dāng)于*(*q),表示指針變量q是指向一個字符指針變量的。6.2.4多級指針1.二級指針變量的定義
2023/1/466指針的指針是指向指針數(shù)據(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ù)類型表);說明:類型名為函數(shù)返回的地址值的基類型。例如:int*a(intx,inty);float*b(floatn);char*str(charch);6.3.1返回指針值的函數(shù)2023/1/4696.3指針與函數(shù)返回值為指針的函數(shù)稱為指針類型函數(shù)?!纠?2】輸入一個1-7之間的整數(shù),輸出對應(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】輸入一個1-7之間的整數(shù),輸出對應(yīng)的星期名.運(yùn)行結(jié)
函數(shù)作為程序?qū)嶓w,在程序執(zhí)行前要將其代碼裝入內(nèi)存,占據(jù)內(nèi)存中的一段連續(xù)存儲區(qū)域,因此也有內(nèi)存地址。函數(shù)在內(nèi)存中一段連續(xù)的存儲區(qū)域的首字節(jié)編號叫函數(shù)的入口地址,又叫做函數(shù)指針.
在C語言中,函數(shù)指針用函數(shù)名表示,它是一個指針常量.可以定義指向函數(shù)的指針變量來接受函數(shù)指針,然后通過指向函數(shù)的指針變量來訪問該函數(shù).
6.3.2指向函數(shù)的指針2023/1/471函數(shù)作為程序
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 皮膚病皮損AI診斷模型的魯棒性提升策略
- 瘢痕疙瘩的疼痛管理策略
- 病理診斷誤差引發(fā)的醫(yī)療糾紛分析
- 病房呼叫系統(tǒng)SOP與響應(yīng)效率
- 生物角膜內(nèi)皮支架的降解速率調(diào)控
- 生物標(biāo)志物在健康管理中的篩查策略
- 生物化學(xué)論文蛋白實驗數(shù)據(jù)的核查策略
- 生物制劑在難治性哮喘中的應(yīng)用路徑
- 瓣膜介入治療中血流動力學(xué)的優(yōu)化策略
- 玻璃體切割術(shù)后持續(xù)性低眼壓的處理
- 福建省廈門市部分學(xué)校2025-2026學(xué)年九年級歷史上學(xué)期期末聯(lián)考試卷(含答案)
- 2025浙江杭州臨平環(huán)境科技有限公司招聘49人筆試模擬試題及答案解析
- 2026年浙江省軍士轉(zhuǎn)業(yè)崗位履職能力考點(diǎn)練習(xí)題及答案
- 生活垃圾焚燒廠運(yùn)管管理規(guī)范
- 江蘇省南京市2025-2026學(xué)年八年級上學(xué)期期末數(shù)學(xué)模擬試卷(蘇科版)(解析版)
- 箱式變電站安裝施工工藝
- 2025年安徽省普通高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試卷(含答案)
- 油罐圍欄施工方案(3篇)
- 國家開放大學(xué)2025年(2025年秋)期末考試真題及答案
- JJF 2333-2025恒溫金屬浴校準(zhǔn)規(guī)范
- 盤箱柜施工方案
評論
0/150
提交評論