版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章指針7.1指針和指針變量
指針和數(shù)組7.2
指針和字符串7.37.4指針和函數(shù)7.5指針數(shù)組本章內(nèi)容導(dǎo)讀本章主要介紹指針和指針變量,以及使用指針變量引用變量、字符串、一維數(shù)組元素的方法。同時(shí)介紹指針數(shù)組的定義和指針數(shù)組元素的使用。通過(guò)學(xué)習(xí)本章,讀者應(yīng)掌握以下內(nèi)容:掌握地址、指針和指針變量的概念;掌握指針變量指向數(shù)組元素、數(shù)組或字符串的方法;掌握指針變量引用一維數(shù)組元素、二維數(shù)組元素或字符串中字符的方法;了解指針數(shù)組的概念和使用方法。地址:一個(gè)變量名代表內(nèi)存中的一個(gè)存儲(chǔ)單元,每個(gè)存儲(chǔ)單元都有一個(gè)編號(hào),即“地址”。
房間—變量名房客—變量值房間號(hào)—地址編譯或函數(shù)調(diào)用時(shí)為變量分配內(nèi)存單元1、指針7.1指針和指針變量?jī)?nèi)存中每個(gè)字節(jié)均有一個(gè)編號(hào)——地址
inti,j;charch;floatf;i=5;j=3;ch='H';f=3.14;
53'H'3.14ijchf……………………2000200220042005200920012003200620072008例如intmain(void)
{intnum;
scanf("%d",&num);
printf("num=%d\n",num);
}C編譯程序編譯到變量定義語(yǔ)句時(shí),將變量num登錄到“符號(hào)表”中。符號(hào)表的關(guān)鍵屬性有兩個(gè):一是“標(biāo)識(shí)符名(id)”,二是該標(biāo)識(shí)符在內(nèi)存空間中的“地址(addr)”。為描述方便,假設(shè)系統(tǒng)分配給變量num的2字節(jié)存儲(chǔ)單元為3000和3001,則起始地址3000就是變量num在內(nèi)存中的地址。變量值的存取──通過(guò)變量在內(nèi)存中的地址進(jìn)行
系統(tǒng)執(zhí)行scanf("%d",&num);和printf("num=%d\n",num);時(shí),存取變量num值的方式有兩種:1、指針7.1指針和指針變量直接訪(fǎng)問(wèn)──直接利用變量的地址進(jìn)行存?。?)上例中scanf("%d",&num);的執(zhí)行過(guò)程:用變量名num作為索引值,檢索符號(hào)表,找到變量num的起始地址3000;然后將鍵盤(pán)輸入的值(假設(shè)為3)送到內(nèi)存單元3000和3001中。此時(shí),變量num在內(nèi)存中的地址和值。(2)printf("num=%d\n",num);的執(zhí)行過(guò)程與scanf相似.首先找到變量num的起始地址3000,然后從3000和3001中取出其值,最后將它輸出。間接訪(fǎng)問(wèn)──通過(guò)另一變量訪(fǎng)問(wèn)該變量的值
1、指針7.1指針和指針變量例如,假設(shè)定義了一個(gè)指針變量num_pointer,它被分配到4000、4001單元,其值可通過(guò)賦值語(yǔ)句num_pointer=#得到。此時(shí),指針變量num_pointer的值就是變量num在內(nèi)存中的起始地址3000。通過(guò)指針變量num_pointer存取變量num值的過(guò)程:首先找到指針變量num_pointer的地址(4000),取出其值3000(正好是變量num的起始地址);然后從3000、3001中取出變量num的值(3)。比較兩種訪(fǎng)問(wèn)方式之間的關(guān)系,可以用某人甲(系統(tǒng))要找某人乙(變量)類(lèi)比。一種情況是,甲知道乙在何處,直接去找就是(即直接訪(fǎng)問(wèn))。另一種情況是,甲不知道乙在哪,但丙(指針變量)知道,此時(shí)甲可以這么做:先找丙,從丙處獲得乙的去向,然后再找乙(即間接訪(fǎng)問(wèn))。1、指針7.1指針和指針變量例inti;int*p=&i;變量必須已說(shuō)明過(guò)類(lèi)型應(yīng)一致例
int*p=&i;
inti;(
)例inti;int*p=&i;int*q=p;用已初始化指針變量作初值定義格式[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型符*指針變量名[=初始地址值],…;2、指針變量的定義和初始化7.1指針和指針變量說(shuō)明(1)“*”表示定義一個(gè)指針變量。指針變量的前面必須有“*”號(hào)。(2)在定義指針變量的同時(shí)也可以定義普通變量或數(shù)組等。(3)“數(shù)據(jù)類(lèi)型符”是指針變量所指向變量的數(shù)據(jù)類(lèi)型,可以是任何基本數(shù)據(jù)類(lèi)型,也可以是其它數(shù)據(jù)類(lèi)型。這個(gè)數(shù)據(jù)類(lèi)型符不是指針變量中存放的數(shù)據(jù)類(lèi)型,而是指針變量所指向的變量或數(shù)組的數(shù)據(jù)類(lèi)型。(4)“初始地址值”通常是&變量名、&數(shù)組元素或一維數(shù)組名,這里的變量或數(shù)組必須是已經(jīng)定義過(guò)的。(5)在定義指針變量時(shí),可以只給部分指針變量賦初值。(6)指針變量的初始化,除了可以是已定義變量的地址,也可以是已初始化的同類(lèi)型的指針變量,也可以是NULL(空指針)。(7)指針變量初始化時(shí),指針變量的“數(shù)據(jù)類(lèi)型符”必須與其“初始地址值”是同一類(lèi)型。2、指針變量的定義和初始化7.1指針和指針變量…...…...2000200420062005整型變量i10指針變量pi2001200220032000指針
變量的內(nèi)容
變量的地址inti,*pi;i=10;pi=&i;2、指針變量的定義和初始化7.1指針和指針變量?jī)?nèi)存地址──內(nèi)存中存儲(chǔ)單元的編號(hào)(1)計(jì)算機(jī)系統(tǒng)的內(nèi)存中,擁有大量的存儲(chǔ)單元(容量為1字節(jié))。為了方便管理,必須為每一個(gè)存儲(chǔ)單元編號(hào),這個(gè)編號(hào)就是存儲(chǔ)單元的“地址”。每個(gè)存儲(chǔ)單元都有一個(gè)惟一的地址。(2)在地址所標(biāo)識(shí)的存儲(chǔ)單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與內(nèi)存單元中的數(shù)據(jù)是兩個(gè)完全不同的概念。變量地址──系統(tǒng)分配給變量的內(nèi)存單元的起始地址2、指針變量的定義和初始化7.1指針和指針變量給指針變量賦值格式:指針變量=地址型表達(dá)式直接使用指針變量格式:指針變量名通過(guò)指針變量引用所指向的變量格式:*指針變量名3、指針變量的一般使用7.1指針和指針變量
取地址運(yùn)算符&:取變量的地址,單目運(yùn)算符、右結(jié)合性。
指針運(yùn)算符*:取指針變量所向指地址中的內(nèi)容,與&為互逆運(yùn)算。單目運(yùn)算符、右結(jié)合性。例:inti=5,j,*pi;
pi=&i;例:j=*pi;相當(dāng)于j=i;4000指針變量pi整型變量i5*pi&i
pi=&i=&(*pi)i=*pi=*(&i)4、指針的基本運(yùn)算7.1指針和指針變量輸出結(jié)果:x=6,y=9MAX=9,MIN=6…...…...指針變量px
指針變量p20002008200220042006
指針變量py
整型變量y
整型變量x6200692008200620082006【例7-1】輸入x、y兩個(gè)整數(shù),按先大后小的順序輸出x、y。#include<stdio.h>intmain(void){
intx,y,*px,*py,*p;
scanf("%d%d",&x,&y);
px=&x;py=&y;
if(x<y){p=px;px=py;py=p;}
printf("x=%d,y=%d\n",x,y);printf("MAX=%d,MIN=%d\n",*px,*py);return0;}運(yùn)行輸入:69指針變量指向一維數(shù)組的方式在數(shù)據(jù)定義語(yǔ)句中用賦初值的方式
*指針變量=數(shù)組名;在程序中用賦值的方式
指針變量=數(shù)組名;將指針變量指向一維數(shù)組元素的方式在數(shù)據(jù)定義語(yǔ)句中用賦初值的方式
*指針變量=&數(shù)組名[下標(biāo)];在程序中用賦值的方式
指針變量=&數(shù)組名[下標(biāo)];當(dāng)指針變量指向一維數(shù)組時(shí),引用下標(biāo)為i的一維數(shù)組元素的方法
*(指針變量+i)
*(數(shù)組名+i)
指針變量[i]
數(shù)組名[i]1、指針和一維數(shù)組7.2指針和數(shù)組數(shù)組元素的四種表示方法a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下標(biāo)法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針?lè)?p*(p+1)*(p+2)*(p+9)a[i]
p[i]
*(p+i)
*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]區(qū)別:數(shù)組名a是地址常量,不可實(shí)現(xiàn)其自身的改變,如a++或&a非法;而數(shù)組指針p是地址變量,p++和&p合法。例inta[10],*p;
p=a;//
p=&a[0];
或int*p=&a[0];或int*p=a;a[0]a[1]a[2]a[3]a[9]...整型指針p&a[0]p1、指針和一維數(shù)組7.2指針和數(shù)組
賦值運(yùn)算例pi=&i;//將變量i地址p
i=pi;//()不能把pi的值整型變量
p=array;//將數(shù)組array首地址pp=&array[i];//將數(shù)組元素地址pp1=p2;//指針變量p2值p1pj=0;//空指針,相當(dāng)于pj=NULL;2、指針變量的運(yùn)算7.2指針和數(shù)組算術(shù)運(yùn)算例p指向float數(shù),則p+1
p+14例p指向int型數(shù)組,且p=&a[0];
則p+1指向a[1]例inta[10];int*p=&a[2];p++;*p=1;例inta[10];int*p1=&a[2];int*p2=&a[5];
則:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數(shù)組pp+1,a+1p+i,a+ip+9,a+91若p=&i;則p
n&isizeof(i)np++,p--,p+n,p-n,p+=n,p-=n的含義
若p1與p2指向同一數(shù)組,則p1-p2=兩指針間元素個(gè)數(shù)
(p1-p2)/sizeof(i)p1+p2無(wú)意義關(guān)系運(yùn)算:表示兩個(gè)指針變量所指向地址位置的前后關(guān)系。若px和py指向同一數(shù)組,則px<py表示p1指的元素在前px>py表示p1指的元素在后px==py
表示p1與p2指向同一存儲(chǔ)單元px==0
表示px為空指針
p==NULL若p1與p2不指向同一數(shù)組,比較無(wú)意義2、指針變量的運(yùn)算7.2指針和數(shù)組【例7-2】使用指針變量。#include<stdio.h>inta[]={0,1,2,3,4};intmain(void){
inti,*p;
for(i=0;i<=4;i++)printf("%d\t",a[i]);
putchar('\n');
for(p=&a[0];p<=&a[4];p++)printf("%d\t",*p);
putchar('\n');
for(p=&a[0],i=1;i<=5;i++)printf("%d\t",p[i]);
putchar('\n');
for(p=a,i=0;p+i<=a+4;p++,i++)
printf("%d\t",*(p+i));
putchar('\n');
return0;}a[0]a[1]a[2]a[3]a[4]01234p0123401234123425637024指向字符串的指針變量在數(shù)據(jù)定義語(yǔ)句中用賦初值的方式*指針變量=字符串在程序中用賦值的方式指針變量=字符串;
指向字符數(shù)組的指針變量可以將一個(gè)字符串賦值給一個(gè)字符數(shù)組,也可以賦值給一個(gè)字符指針變量。7.3指針和字符串#include<stdio.h>intmain(void){
staticchars1[]="IloveChina!";
printf("%s\n%c\t%c\n",s1,s1[0],*(s1+3));
return0;}IloveChis1[0]s1[1]s1[2]s1[3]s1[4]s1[5]s1[6]s1[7]s1[8]s1[9]s1s1[10]s1[11]s1[12]s1[13]n!a\0字符串表示形式字符數(shù)組方式IloveChina!Io7.3指針和字符串字符指針?lè)绞?/p>
#include<stdio.h>intmain(void){char*s2="IloveChina!";char*s3,c;char*s4="w";s3=&c;*s3='H';s2=s2+2;printf("%s\t%c\t%s\n",s2,*s3,s4);return0;}IloveChin!a\0w\0s4cs2字符指針初始化:把字符串首地址賦給stringchar*s2;s2="IloveChina!";s2LoveChina!HwHs3字符數(shù)組與字符指針的區(qū)別對(duì)字符數(shù)組整體賦值只能在初始化時(shí)進(jìn)行;而對(duì)指針變量賦值,既可在初始化時(shí)進(jìn)行,又可在其他地方賦值。
str是地址常量;cp是地址變量,cp接受鍵入字符串時(shí),必須先開(kāi)辟存儲(chǔ)空間。例charstr[10];scanf("%s",str);(
)而char*cp;scanf("%s",cp);(
)改為:char*cp,str[10];cp=str;scanf("%s",cp);(
)char*cp;charstr[20];
charstr[20];str="IloveChina!";(
)char*cp;cp="IloveChina!";(
)7.3指針和字符串對(duì)于一維數(shù)組數(shù)組名a表示數(shù)組的首地址,即&a[0]。數(shù)組名a是地址常量。
a+i是元素a[i]的地址,即&a[i]。
a[i]
*(a+i)
ainta[10];7.3指針和字符串對(duì)于二維數(shù)組a是數(shù)組名,包含三個(gè)元素
a[0]、a[1]和a[2]。每個(gè)元素a[i]又是一個(gè)一維數(shù)組,包含4個(gè)元素。aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]行指針與列指針a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+1
對(duì)于二維數(shù)組inta[3][4]:a——二維數(shù)組的首地址,即第0行的首地址a+i——第i行的首地址a[i]*(a+i)——第i行第0列的元素地址a[i]+j*(a+i)+j——第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],
值相等,含義不同a+i
&a[i],表示第i行首地址,指向行a[i]
*(a+i)
&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2表示形式含義地址a二維數(shù)組名,數(shù)組首地址a[0],*(a+0),*a第0行第0列元素地址a+1第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素地址*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素值20002000200820082012137.3指針和字符串inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]二維數(shù)組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)(4)*(&a[0][0]+1*4+2)地址表示:(1)a+1
(2)&a[1][0](3)a[1](4)
*(a+1)(5)(int*)(a+1)行指針列指針地址表示形式:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2(4)&a[0][0]+1*4+2【例7-3】將字符串t復(fù)制到s中,并返回被復(fù)制的字符個(gè)數(shù)。#include<stdio.h>intstrcpy(s,t)char*s,*t;{inti;i=0;while((*s=*t)!='\0'){s++;t++;i++;}return(i);}intmain(void){intn;char*ss,*tt;gets(ss);/*scanf("%s",ss);*/n=strcpy(*ss,*tt);printf("%d,%s",n,tt);return0;}while(*s++=*t++)i++;函數(shù)的參數(shù)不僅可以是整型、實(shí)型、字符型等數(shù)據(jù)類(lèi)型,還可以是指針類(lèi)型,因此可以像普通變量一樣在函數(shù)間傳遞指針變量的值。指針變量作為函數(shù)參數(shù)指針變量,可以作為函數(shù)的形參,也可以作函數(shù)的實(shí)參。指針變量作實(shí)參時(shí),形參和實(shí)參之間的數(shù)據(jù)傳遞方式本質(zhì)上是“值傳遞”,即將指針變量的值(一個(gè)地址)傳遞給被調(diào)用函數(shù)的形參(必須是一個(gè)指針變量)。注意:被調(diào)用函數(shù)不能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指向的變量的值。1、指針作為函數(shù)參數(shù)7.4指針和函數(shù)#include<stdio.h>intmain(void){intx,y;scanf("%d,%d",&x,&y);if(x<y)swap(x,y);printf("\n%d\t%d\n",x,y);}swap(intx1,inty1){inttemp;temp=x1;x1=y1;y1=temp;return0;}【例7-4】將數(shù)從大到小輸出(普通參數(shù))?!?..…...20002008200A2002200420067變量x
變量y(main)10
變量temp
變量y1
變量x1(swap)7710710COPY…...…...20002008200A20022004200610變量x
變量y(main)7值傳遞710#include<stdio.h>intmain(void){intx,y;
int*p1,*p2;
scanf("%d,%d",&x,&y);
p1=&x;p2=&y;
if(x<y)swap(p1,p2);
printf("\n%d\t%d\n",x,y);}swap(px,py)int*px,*py;{inttemp;
temp=*px;
*px=*py;
*py=temp;
return0;}…...20002008200A200220042006200C200E2010...710整型變量x
整型變量y(main)指針p1指針p220002002(swap)指針px指針py整型temp71020002002COPY7【例7-5】將數(shù)從大到小輸出(指針參數(shù))…...20002008200A200220042006200C200E2010...59整型變量x
整型變量y(main)指針p1指針p220002002710地址傳遞710數(shù)組名作為函數(shù)形參時(shí),接收實(shí)參數(shù)組的首地址;數(shù)組名作為函數(shù)實(shí)參時(shí),將數(shù)組的首地址傳遞給形參數(shù)組。數(shù)組及指向數(shù)組的指針變量作為函數(shù)參數(shù)以下4種形式等價(jià)(本質(zhì)均是指針數(shù)據(jù)作函數(shù)參數(shù))形參、實(shí)參均為數(shù)組名形參、實(shí)參均為指針變量形參為指針變量、實(shí)參為數(shù)組名形參為數(shù)組名、實(shí)參為指針變量2、數(shù)組名作為函數(shù)參數(shù)7.4指針和函數(shù)
定義
函數(shù)可以返回一個(gè)int型、float型、char型的數(shù)據(jù),也可以返回一個(gè)指針類(lèi)型數(shù)據(jù),即返回一個(gè)地址。格式
函數(shù)類(lèi)型*函數(shù)名([形參表])調(diào)用指針型函數(shù)的調(diào)用和一般函數(shù)的調(diào)用方法完全相同,但需要注意的是只能使用指針變量或指針數(shù)組元素接收指針型函數(shù)的返回值,不能使用數(shù)組名接收指針型函數(shù)的返回值,因?yàn)楹瘮?shù)名是地址常量,不是地址型變量,不能接收地址型數(shù)據(jù)。
3、指針型函數(shù)7.4指針和函數(shù)【例7-6】在一個(gè)字符數(shù)組中查找一個(gè)給定的字符,如果找到則輸出該字符開(kāi)始的字符串,否則輸出“NOFOUNDTHISCHARACTER”。#include<stdio.h>intmain(void){chars[80],*p,ch,*match();gets(s);ch=getchar();p=match(ch,s);if(p)printf("thereisthestring:%s\n",p);elseprintf("NOFOUNDTHISCHARACTER\n");}char*match(c,s)charc,*s;{intcount=0;
while(c!=s[count]&&s[count]!='\0')count++;
if(c==s[count])return(&s[count]);
return0;}輸入:wertypooypiy輸出:thereisthestring:ypooypi指針數(shù)組中的元素為指針變量,用于處理二維數(shù)組或多個(gè)字符串。定義格式[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型符*指針數(shù)組名[數(shù)組長(zhǎng)度];說(shuō)明(1)指針數(shù)組名是標(biāo)識(shí)符,前面必須加“*”號(hào)。(2)定義指針數(shù)組的同時(shí)可以定義普通變量、數(shù)組和指針變量等。(3)“數(shù)據(jù)類(lèi)型符”可以是任何基本數(shù)據(jù)類(lèi)型,也可以是后續(xù)介紹的其它數(shù)據(jù)類(lèi)型。例int*p[6];//長(zhǎng)度為6的指針數(shù)組。
int(*p)[6];//指向一個(gè)長(zhǎng)為6的數(shù)組的指針變量。7.5指針數(shù)組指針數(shù)組元素的賦值(1)將數(shù)組名賦予指針數(shù)組各元素。例如
chars[4][20]={"China","America","Russia",NULL};char*p[4];p[0]=s[0];/*給指針數(shù)組元素p[0]賦值s[0],s[0]是字符串"China"的首地址*/(2)將字符串直接賦予指針數(shù)組元素。例如
char*p[4];p[0]="China";/*直接給指針數(shù)組元素p[0]賦值為字符串"China"的首地址*/7.5指針數(shù)組指針數(shù)組元素的使用指針數(shù)組元素和普通數(shù)組元素的表示方法完全相同。指針數(shù)組元素的使用和指針變量的使用完全相同,可以對(duì)其賦予地址值,可以利用其引用所指向的變量或數(shù)組元素,也可以參與運(yùn)算。7.5指針數(shù)組使用方法使用格式對(duì)其賦值指針數(shù)組名[下標(biāo)]=地址表達(dá)式引用所指向的變量或數(shù)組元素*指針數(shù)組名[下標(biāo)]參與運(yùn)算算術(shù)運(yùn)算指針數(shù)組名[下標(biāo)]+整數(shù)指針數(shù)組名[下標(biāo)]-整數(shù)++指針數(shù)組名[下標(biāo)]--指針數(shù)組名[下標(biāo)]指針數(shù)組名[下標(biāo)]++指針數(shù)組名[下標(biāo)]--關(guān)系運(yùn)算指針數(shù)組名[下標(biāo)1]關(guān)系運(yùn)算符指針數(shù)組名[下標(biāo)2]【例7-7】利用指針數(shù)組訪(fǎng)問(wèn)多維數(shù)組元素。#include<stdio.h>intmain(void){
inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int*pa[3]={a[0],a[1],a[2]};
inti,*p=a[0];for(i=0;i<3;i++)
printf("%d\t%d\t%d\n",a[i][2-i],*a[i],*(*(a+i)+i));for(i=0;i<3;i++)
printf("%d\t%d\n",*pa[i],p[i]);
return0;}pa[0]pa[1]
pa[2]a[0]a[1]a[2]147258369311545779114273ThankYou!第8章結(jié)構(gòu)體類(lèi)型和自定義類(lèi)型8.1結(jié)構(gòu)體類(lèi)型定義結(jié)構(gòu)體類(lèi)型變量8.2結(jié)構(gòu)體類(lèi)型數(shù)組8.38.4結(jié)構(gòu)體類(lèi)型指針8.5自定義類(lèi)型本章內(nèi)容導(dǎo)讀本章主要介紹結(jié)構(gòu)體類(lèi)型的定義、初始化和引用,結(jié)構(gòu)體類(lèi)型數(shù)組的定義、初始化和引用,以及結(jié)構(gòu)體類(lèi)型指針的使用和自定義類(lèi)型及其使用。通過(guò)學(xué)習(xí)本章,讀者應(yīng)掌握以下內(nèi)容:了解結(jié)構(gòu)體類(lèi)型數(shù)據(jù)的特點(diǎn);掌握結(jié)構(gòu)體類(lèi)型定義方法,結(jié)構(gòu)體類(lèi)型變量、數(shù)組和指針變量的定義、初始化和結(jié)構(gòu)體類(lèi)型數(shù)據(jù)成員的引用方法;掌握用戶(hù)自定義數(shù)據(jù)類(lèi)型的定義方法和應(yīng)用。C語(yǔ)言中的結(jié)構(gòu)體類(lèi)型,相當(dāng)于其它高級(jí)語(yǔ)言中的“記錄”類(lèi)型。不同于基本數(shù)據(jù)類(lèi)型,結(jié)構(gòu)體類(lèi)型是用戶(hù)自定義的一種數(shù)據(jù)類(lèi)型,由若干個(gè)數(shù)據(jù)項(xiàng)組合而成,這些數(shù)據(jù)項(xiàng)稱(chēng)為結(jié)構(gòu)體類(lèi)型的成員(又稱(chēng)為“域”或“結(jié)構(gòu)分量”),每個(gè)成員可以是一個(gè)基本數(shù)據(jù)類(lèi)型,也可以是一個(gè)構(gòu)造數(shù)據(jù)類(lèi)型。結(jié)構(gòu)體類(lèi)型必須先定義,然后才能使用已定義的結(jié)構(gòu)體類(lèi)型定義相應(yīng)的變量、數(shù)組和指針等。定義格式struct結(jié)構(gòu)體類(lèi)型名/*struct是結(jié)構(gòu)類(lèi)型關(guān)鍵字*/{數(shù)據(jù)類(lèi)型符成員名1;
數(shù)據(jù)類(lèi)型符成員名2;
…………
數(shù)據(jù)類(lèi)型符成員名n;
};
/*此行分號(hào)不能少!*/
8.1結(jié)構(gòu)體類(lèi)型定義【例8-1】定義一個(gè)反映學(xué)生基本情況的結(jié)構(gòu)體類(lèi)型,用以存儲(chǔ)學(xué)生的相關(guān)信息。structdate /*日期結(jié)構(gòu)類(lèi)型:由年、月、日三項(xiàng)組成*/{intyear;intmonth;intday;};structstd_info/*學(xué)生信息結(jié)構(gòu)類(lèi)型:由學(xué)號(hào)、姓名、性別和生日共4項(xiàng)組成*/{charno[7];charname[9];charsex[3];structdatebirthday;};structscore /*成績(jī)結(jié)構(gòu)類(lèi)型:由學(xué)號(hào)和三門(mén)成績(jī)共4項(xiàng)組成*/{charno[7];intscore1;intscore2;intscore3;};說(shuō)明(1)“結(jié)構(gòu)體類(lèi)型名”和“成員名”的命名規(guī)則,與變量名相同。(2)數(shù)據(jù)類(lèi)型相同的成員,既可逐個(gè)、逐行分別定義,也可合并在一行定義。例如【例8-1】代碼中的日期結(jié)構(gòu)體類(lèi)型,也可改為如下形式:
structdate{intyear,month,day;};(3)結(jié)構(gòu)體類(lèi)型中的成員,既可以是基本數(shù)據(jù)類(lèi)型,也允許是另一個(gè)已經(jīng)定義的結(jié)構(gòu)體類(lèi)型。例如【例8-1】代碼中的結(jié)構(gòu)體類(lèi)型std_info,其數(shù)據(jù)項(xiàng)“birthday”就是一個(gè)已經(jīng)定義的日期結(jié)構(gòu)體類(lèi)型date。(4)一個(gè)數(shù)據(jù)項(xiàng)稱(chēng)為結(jié)構(gòu)類(lèi)型的一個(gè)成員(或分量)。8.1結(jié)構(gòu)體類(lèi)型定義用戶(hù)自己定義的結(jié)構(gòu)體類(lèi)型,與系統(tǒng)定義的標(biāo)準(zhǔn)類(lèi)型(int、char等)一樣,可用來(lái)定義結(jié)構(gòu)體變量的類(lèi)型。間接定義法──先定義結(jié)構(gòu)體類(lèi)型、再定義結(jié)構(gòu)體類(lèi)型的變量例如利用【例8-1】中定義的學(xué)生信息結(jié)構(gòu)類(lèi)型std_info,定義了一個(gè)相應(yīng)的結(jié)構(gòu)變量student:
structstd_infostudent;結(jié)構(gòu)體類(lèi)型變量student:擁有結(jié)構(gòu)體類(lèi)型的全部成員,其中成員birthday是一個(gè)日期結(jié)構(gòu)體類(lèi)型,它又由3個(gè)成員構(gòu)成。注意:使用間接定義法定義結(jié)構(gòu)體類(lèi)型變量時(shí),必須同時(shí)指定結(jié)構(gòu)體類(lèi)型名。1、結(jié)構(gòu)體類(lèi)型變量的定義8.2結(jié)構(gòu)體類(lèi)型變量直接定義法──在定義結(jié)構(gòu)體類(lèi)型的同時(shí),定義結(jié)構(gòu)體類(lèi)型變量例如,結(jié)構(gòu)體類(lèi)型變量student的定義可改為:structstd_info{
……}student;說(shuō)明(1)結(jié)構(gòu)體類(lèi)型與結(jié)構(gòu)體類(lèi)型變量是兩個(gè)不同的概念,其區(qū)別如同int類(lèi)型與int型變量的區(qū)別一樣。(2)結(jié)構(gòu)體類(lèi)型中的成員名,可以與程序中的變量同名,它們代表不同的對(duì)象,互不干擾。1、結(jié)構(gòu)體類(lèi)型變量的定義8.2結(jié)構(gòu)體類(lèi)型變量無(wú)名定義法──省略結(jié)構(gòu)體類(lèi)型、直接定義結(jié)構(gòu)體類(lèi)型變量將結(jié)構(gòu)體類(lèi)型和結(jié)構(gòu)體類(lèi)型變量同時(shí)進(jìn)行定義,但省略了結(jié)構(gòu)體類(lèi)型名,以后將無(wú)法再使用這種結(jié)構(gòu)體類(lèi)型定義其他變量。例如struct{…}a,b;第二種和第三種定義結(jié)構(gòu)體類(lèi)型變量的一般格式如下:
struct[結(jié)構(gòu)體類(lèi)型名]
{……
}結(jié)構(gòu)體類(lèi)型變量表;注意:結(jié)構(gòu)體類(lèi)型定義的是一個(gè)數(shù)據(jù)結(jié)構(gòu)的模板,其中并無(wú)具體數(shù)據(jù),系統(tǒng)不會(huì)為其分配實(shí)際的內(nèi)存空間,定義了結(jié)構(gòu)體類(lèi)型變量后,編譯系統(tǒng)才為結(jié)構(gòu)體類(lèi)型變量分配存儲(chǔ)空間,順序存放各個(gè)成員。1、結(jié)構(gòu)體類(lèi)型變量的定義8.2結(jié)構(gòu)體類(lèi)型變量【例8-2】計(jì)算結(jié)構(gòu)體類(lèi)型(或結(jié)構(gòu)體變量)的字節(jié)數(shù)。#include<stdio.h>#defineNAMESIZE20#defineADDRSIZE100structbirthday{intyear;intmonth;intday;};structperson{charname[NAMESIZE];structbirthdaydate;charsex;charaddress[ADDRSIZE];longzipcode;};intmain(void){structpersonp;printf("theplength:%d\n",sizeof(p));printf("thestructpersonlength:%d\n",sizeof(structperson));return0;}結(jié)構(gòu)體變量的存儲(chǔ)結(jié)構(gòu):
對(duì)結(jié)構(gòu)體變量成員順序分配存儲(chǔ)空間。Theplength:131Thestructpersonlength:131間接初始化直接初始化無(wú)名初始化注意:初值的數(shù)據(jù)類(lèi)型,應(yīng)與結(jié)構(gòu)變量中相應(yīng)成員所要求的一致,否則會(huì)出錯(cuò)。
2、結(jié)構(gòu)體類(lèi)型變量的初始化8.2結(jié)構(gòu)體類(lèi)型變量【例8-3】結(jié)構(gòu)體變量的初始化。#include<stdio.h>#defineNAMESIZE20#defineADDRSIZE100structbirthday{intyear;intmonth;intday;};structperson{charname[NAMESIZE];structbirthdaydate;charsex;charaddress[ADDRSIZE];longzipcode;};structpersonp={"LiPing",{1994,12,25},'m',"zhongshanroad",310000};intmain(void){printf("Name:%s\n",);printf("birthday:%d,%d,%d\n",p.date.year,p.date.month,p.date.day);printf("sex:%c\n",p.sex);printf("address:%s\n",p.address);printf("zipcode:%ld\n",p.zipcode);return0;}name:LiPingbirthday:1994,12,25sex:maddress:zhongshanroadzipcode:310000(1)對(duì)于結(jié)構(gòu)體類(lèi)型變量,通過(guò)成員運(yùn)算符“.”,逐個(gè)訪(fǎng)問(wèn)其成員,其一般形式是:結(jié)構(gòu)體類(lèi)型變量名.成員名/*其中的“.”是成員運(yùn)算符*/(2)如果某成員本身又是一個(gè)結(jié)構(gòu)類(lèi)型,則只能通過(guò)多級(jí)的分量運(yùn)算,對(duì)最低一級(jí)的成員進(jìn)行引用,其引用格式擴(kuò)展為:
結(jié)構(gòu)變量.成員.子成員.….最低1級(jí)子成員例如,引用結(jié)構(gòu)變量student中的birthday成員的格式分別為:
student.birthday.yearstudent.birthday.monthstudent.birthday.day而student.birthday相當(dāng)于引用一個(gè)結(jié)構(gòu)體類(lèi)型變量,一般不能直接引用。對(duì)于最低一級(jí)成員,可像同類(lèi)型的普通變量一樣,進(jìn)行相應(yīng)的各種運(yùn)算。3、結(jié)構(gòu)體類(lèi)型變量成員的引用8.2結(jié)構(gòu)體類(lèi)型變量引用方法&結(jié)構(gòu)體類(lèi)型變量名.成員名
/*成員是變量形式的變量地址*/結(jié)構(gòu)體類(lèi)型變量名.成員名
/*成員是數(shù)組形式的數(shù)組首地址*/&結(jié)構(gòu)體類(lèi)型變量名.成員數(shù)組[下標(biāo)]
/*成員是數(shù)組,其數(shù)組元素的地址*/注意:存放結(jié)構(gòu)體類(lèi)型變量成員地址的指針變量的數(shù)據(jù)類(lèi)型必須與該成員的數(shù)據(jù)類(lèi)型相同。引用方法&結(jié)構(gòu)體類(lèi)型變量名注意:存放結(jié)構(gòu)體類(lèi)型變量地址的指針變量必須是相同類(lèi)型的結(jié)構(gòu)體類(lèi)型指針變量。4、結(jié)構(gòu)體類(lèi)型變量成員地址的引用8.2結(jié)構(gòu)體類(lèi)型變量5、結(jié)構(gòu)體類(lèi)型變量地址的引用
定義格式
struct結(jié)構(gòu)體類(lèi)型名
{成員列表;}
;
struct結(jié)構(gòu)體類(lèi)型名結(jié)構(gòu)體類(lèi)型數(shù)組名[數(shù)組長(zhǎng)度];structstudentaatd[10]={{"zhangming",18,'m'},{"Lipiang",20,'f'}};structstudentaatd[]={{"zhangming",18,'m'},{"Lipiang",20,'f'}};初始化格式struct結(jié)構(gòu)體類(lèi)型數(shù)組名[數(shù)組長(zhǎng)度]={{初值表1},{初值表2},…,{初值表n}};8.3結(jié)構(gòu)體類(lèi)型數(shù)組
結(jié)構(gòu)體類(lèi)型數(shù)組元素成員的引用結(jié)構(gòu)體類(lèi)型數(shù)組名[下標(biāo)].成員名注意:與結(jié)構(gòu)體類(lèi)型變量相同,一般不能直接使用結(jié)構(gòu)體類(lèi)型數(shù)組元素,只能使用其成員。結(jié)構(gòu)體類(lèi)型數(shù)組元素成員地址的引用&結(jié)構(gòu)體類(lèi)型數(shù)組名[下標(biāo)].成員名注意:存放結(jié)構(gòu)體類(lèi)型數(shù)組元素成員地址的指針變量的數(shù)據(jù)類(lèi)型必須與結(jié)構(gòu)體類(lèi)型中該成員的數(shù)據(jù)類(lèi)型相同。8.3結(jié)構(gòu)體類(lèi)型數(shù)組結(jié)構(gòu)體變量在內(nèi)存中的起始地址稱(chēng)為結(jié)構(gòu)體變量的指針?!纠?-4】使用指向結(jié)構(gòu)變量的指針來(lái)訪(fǎng)問(wèn)結(jié)構(gòu)變量的各個(gè)成員。
#include<stdio.h>
structstd_infostudent={"000102","張三","男",{1980,9,20}};
intmain(void){structstd_info*p_std=&student;printf("No:%s\n",p_std->no);printf("Name:%s\n",p_std->name);printf("Sex:%s\n",p_std->sex);printf("Birthday:%d-%d-%d\n",p_std->birthday.year,p_std->birthday.month,p_std->birthday.day);} 8.4結(jié)構(gòu)體類(lèi)型指針通過(guò)指向結(jié)構(gòu)體類(lèi)型變量的指針訪(fǎng)問(wèn)結(jié)構(gòu)體類(lèi)型變量的成員,與直接使用結(jié)構(gòu)體類(lèi)型變量的效果一樣。通常,如果指針變量pointer已指向結(jié)構(gòu)體類(lèi)型變量var,則以下三種形式等價(jià):var.成員pointer->成員(*pointer).成員/*“*pointer”外面的括號(hào)不能?。?/注意:在第一種格式中,分量運(yùn)算符左側(cè)的運(yùn)算對(duì)象只能是結(jié)構(gòu)體類(lèi)型變量;而在第二種格式中,指向運(yùn)算符左側(cè)的運(yùn)算對(duì)象,只能是指向結(jié)構(gòu)體類(lèi)型變量(或結(jié)構(gòu)體類(lèi)型數(shù)組)的指針變量,否則都出錯(cuò)。1、指向結(jié)構(gòu)體類(lèi)型變量的指針變量8.4結(jié)構(gòu)體類(lèi)型指針指針變量指向結(jié)構(gòu)體類(lèi)型數(shù)組元素
方式一:(*指針變量).成員名
方式二:指針變量->成員名注意:這里的指針變量必須已經(jīng)指向某一結(jié)構(gòu)體類(lèi)型數(shù)組元素。指針變量指向結(jié)構(gòu)體類(lèi)型數(shù)組
方式一:(*(指針變量+i)).成員名方式二:(指針變量+i)->成員名注意:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程進(jìn)水排水承包合同(2篇)
- 無(wú)錫2024年10版小學(xué)六年級(jí)下冊(cè)英語(yǔ)第2單元真題
- 淺談小學(xué)英語(yǔ)教師素質(zhì)培養(yǎng)的思考
- 小學(xué)長(zhǎng)期配送午餐的配送服務(wù)合同(2篇)
- 藝術(shù)展覽展示活動(dòng)方案
- KOL達(dá)人加盟協(xié)議
- 幼兒園食品安全與防疫方案
- 銀川-PEP-2024年11版小學(xué)三年級(jí)上冊(cè)英語(yǔ)第2單元寒假試卷
- 科技創(chuàng)新展示活動(dòng)方案
- 短租平臺(tái)租房合同示例
- DB32-T 4353-2022 房屋建筑和市政基礎(chǔ)設(shè)施工程檔案資料管理規(guī)程
- 設(shè)備部管理評(píng)審報(bào)告
- (中職)計(jì)算機(jī)應(yīng)用基礎(chǔ)第4章Word2010的使用課件
- 地下管線(xiàn)探測(cè)工程普查實(shí)施方案
- 廣東省墾造水田項(xiàng)目
- 六年級(jí)數(shù)學(xué)上冊(cè)課件-3.1 倒數(shù)的認(rèn)識(shí) 人教版(共12張PPT)
- 2抽水蓄能電站在電力系統(tǒng)中的作用
- 食源性疾病監(jiān)測(cè)報(bào)表
- 組織級(jí)項(xiàng)目管理成熟度(OPM3)
- (完整PPT)干眼的診治課件
- 一對(duì)一談心談話(huà)記錄3篇精選
評(píng)論
0/150
提交評(píng)論