版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第十二講
特殊數(shù)據(jù)類型——指針變量的地址和指針變量內(nèi)存里每個字節(jié)都有一個編號,相當(dāng)于房間都有門牌號。變量的地址:每個變量都占據(jù)了1個或1個以上的字節(jié),分配給該變量的第1個字節(jié)的地址即為該變量的地址,也稱為該變量的指針。指針變量:是一種特殊的變量,它存放的內(nèi)容是另外一個變量的地址。變量的地址和指針變量存放的數(shù)值:56整型變量名:a所在內(nèi)存地址:2000存放的數(shù)值:a的地址2000整型指針變量名:p所在內(nèi)存地址:4000指針變量的定義和賦值定義的一般格式: 類型名*
指針變量名;如:int*p1,*p2; float*p2;注意:同時定義多個指針變量,勿寫成:類型名*
指針變量名1,指針變量名2,指針變量名n;如int*p1,p2;這樣只是定義了p1為指針變量,而p2為整型變量。另外*不屬于變量名的組成部分,而只是說明該變量是指針變量。指針變量的賦值操作:voidmain(){int*p1,*p2;intx;p1=&x;p2=p1; }取地址運(yùn)算符和指針運(yùn)算符&:取地址運(yùn)算符*:指針運(yùn)算符(或稱“間接訪問”運(yùn)算符)例如:&a獲取變量a的地址*p獲取對指針變量p所指向的存儲單元的引用。運(yùn)算時實(shí)際上有兩個步驟:1.讀取變量p內(nèi)存放的地址,2.獲取該地址所對應(yīng)的變量的引用。
引用指的是既可以得到該存儲單元的值,也能對其值進(jìn)行改變。例10.1通過指針變量訪問整型變量main(){inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d,%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2); }課堂練習(xí)寫一個函數(shù),實(shí)現(xiàn)交換兩個數(shù)的值。指針變量作為函數(shù)參數(shù)作用:將一個變量的地址傳送到另一個函數(shù)中。應(yīng)用:使被調(diào)用函數(shù)能夠改變調(diào)用它的函數(shù)內(nèi)定義的變量的值。示例:交換兩個數(shù)的值swap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;}main(){inta,b;int*p1,*p2;scanf(“%d%d”,&a,&b); p1=&a;p2=&b;printf(“a=%d,b=%d”,a,b);swap(p1,p2);printf(“a=%d,b=%d”,a,b);}指針變量的加減運(yùn)算指針變量與指針變量的加減運(yùn)算“+”運(yùn)算:不合法?!?”運(yùn)算:合法,所得到的值為兩個地址之間的偏移量。10.3數(shù)組與指針一維數(shù)組與指針二維數(shù)組與指針一維數(shù)組的指針一維數(shù)組的指針(地址):數(shù)組的起始地址,用數(shù)組名表示inta[10];a內(nèi)存用戶數(shù)據(jù)區(qū)變量i變量j36地址2000地址2002i20003&i指針/地址變量名地址/指針值變量值一維數(shù)組元素的指針1(10.3.1)inta[10];aa+1a+3a+2a+6a+5a+4a+9a+8a+7數(shù)組元素的指針(地址):數(shù)組元素的地址
指
針inta[10];一維數(shù)組元素的指針2(10.3.1)指針1aa+1a+3a+2a+6a+5a+4a+9a+8a+7a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]下標(biāo)法&:地址運(yùn)算符,表示單元地址指針2&a[0]&a[1]&a[2]&a[3]&a[4]&a[5]&a[6]&a[7]&a[8]&a[9]元素引用元素指針inta[10];一維數(shù)組元素的引用2——指針法(10.3.2)aa+1a+3a+2a+6a+5a+4a+9a+8a+7a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]下標(biāo)法指針法*a*(a+1)*(a+2)*(a+3)*(a+4)*(a+5)*(a+6)*(a+7)*(a+8)*(a+9)*:指針運(yùn)算符,表示所指向的單元元素引用指針2&a[0]&a[1]&a[2]&a[3]&a[4]&a[5]&a[6]&a[7]&a[8]&a[9]指針1元素指針指向數(shù)組元素的指針由于數(shù)組內(nèi)的每個元素相當(dāng)于一個變量,故指向數(shù)組元素的指針變量的定義與前面介紹的方法相同。例如:
inta[10];int*p1,*p2;p1=&a[0];p2=&a[3];通過指針引用數(shù)組元素inta[10];int*p=&a[0];p+i指向數(shù)組a的第i個元素.a[10]a[0]a[3]a[2]a[1]a[4]a[7]a[6]a[5]a[9]a[8]pp+1p+4通過指針引用數(shù)組元素inta[10];int*p=&a[0];或int*p=a;則a[2]、*(a+2)、p[2]、*(p+2)這四種引用方法等價(jià)。都可以得到對數(shù)組a下標(biāo)為2的元素的引用。數(shù)組做為函數(shù)參數(shù)本質(zhì)上,C語言都是將形參數(shù)組名作為指針變量來處理的。即以下兩個函數(shù)定義形式等價(jià)。因此,當(dāng)調(diào)用fun函數(shù)時,如intb[10];fun(b);是將數(shù)組b的首地址傳給fun函數(shù)的指針a,從而a所指向的存儲空間即為數(shù)組b所在的空間,所以在fun函數(shù)內(nèi)通過a對其指向的存儲單元進(jìn)行賦值操作會改變數(shù)組b的值。voidfun(inta[]){}voidfun(int*a){}指向一維數(shù)組元素的指針變量有關(guān)一維數(shù)組及其指針變量在使用時的注意事項(xiàng)指針變量的值可以改變,即可以使用p++、p+=2、p-=3等,作用是相對于當(dāng)前位置前移或后移若干個存儲單元。(2)數(shù)組名本身表示數(shù)組的首地址,是常量而不是變量,故只能進(jìn)行加減運(yùn)算,但不能進(jìn)行自加自減運(yùn)算.一維數(shù)組元素輸入和輸出方法1
—下標(biāo)法main(){inta[10],i;for(i=0;i<10;i++)
scanf("%d",&a[i]);printf("\n");for(i=0;i<10;i++)
printf("%5d",a[i]);printf("\n");}/*變量i作下標(biāo),i的值只能在0~9之間*/例10.5(P212)一維數(shù)組元素輸入和輸出方法2
—地址偏移量法main(){inta[10],i;for(i=0;i<10;i++)
scanf("%d", );printf("\n");for(i=0;i<10;i++)
printf("%5d", );printf("\n");}例10.5(P213)a+i*(a+i)scanf(“格式控制串”,變量地址表列);scanf第二個參數(shù)實(shí)質(zhì)就是變量的地址。一維數(shù)組元素輸入和輸出方法3—指針移動法main(){inta[10],i,*p=a;
for(i=0;i<10;i++)
scanf("%d",p++);printf("\n");for(i=0;i<10;i++)printf("%5d",*p++);printf("\n");}指針變量加1,即向下移動一個數(shù)組元素,p指向下一個元素注意:前一個循環(huán)結(jié)束時,p所指向的已經(jīng)是一維數(shù)組以外的存儲單元,后一個循環(huán)中再輸出*p++,超過數(shù)組的范圍了。i=0,p=a;i<10;i++)例10.5(P213)一維數(shù)組元素輸入和輸出方法3—指針移動法main(){inta[10],*p=a;for(;p<a+10;p++)
scanf("%d",p);printf("\n");for(p=a;p<a+10;p++)
printf("%5d",*p);}例10.5(P213)二維數(shù)組的指針(地址)
inta[4][10];
a為二維數(shù)組的首行的地址,正如在電影院找座位,你要先找到你在哪一行,然后站到該行前面。a+i或a[i]為第i行的地址,術(shù)語為二維數(shù)組的行地址。 然后找到你的位置在第幾行后,走向該行相應(yīng)的座位,該行座位的位置(地址)表示為:a[i]+j(以第i行第j列為例,注意行列從0開始計(jì)數(shù))。
最后你坐到那個位置上,于是你得到了對那個位置的占有,你可以對那個位置進(jìn)行操作,如賦值a[i][j]=3;這些都是規(guī)定的,不要過于糾結(jié)二維數(shù)組的指針(地址)inta[4][7];a+0a+1a+2a+3元素地址(元素指針)以第0行為例行地址(行指針)a[0]+0aa[0]a[0]+1a[0]+2a[0]+3a[0]+4a[0]+5a[0]+6下標(biāo)運(yùn)算與指針運(yùn)算的互相轉(zhuǎn)換下標(biāo)運(yùn)算可展開為,對下標(biāo)前面的名字與下標(biāo)之行相加后的值進(jìn)行指針運(yùn)算。如:a[i]等價(jià)于*(a+i)a[i][j]等價(jià)于*(a[i]+j)進(jìn)一步等價(jià)于*(*(a+i)+j)小結(jié):對二維數(shù)組aa的第i行的首地址(行地址):a的第i行第j列元素的地址(元素地址):a的第i行第j列元素的值(元素引用):a+ia[i]+j*(a+i)+j&a[i][j]a[i][j]*(a[i]+j)*(*(a+i)+j)a[i]+j<=>*(a+i)+j<=>&a[i][j]——不能寫成*(a+i+j)二維數(shù)組的指針例10.11(P227)用指針訪問二維數(shù)組的元素若inta[3][4];int*p=a[0];則p指向數(shù)組a的第0行第0列元素即a[0][0];p+1指向a[0][1];p+4指向a[1][0];inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]pp+1p+4指向數(shù)組元素的指針變量的一個相對移動量是一個元素,即指針變量的值加1,則向下移動一個元素。例輸出二維數(shù)組中的全部元素
—用元素指針變量main(){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);}}例10.12(P228)例輸出二維數(shù)組中的全部元素
—用元素指針變量main(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int*p=&a[0][0],i,j;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",*(p+i*4+j));printf("\n");}}另解:指向二維數(shù)組的行指針變量定義:類型說明符(*標(biāo)識符)[n]
如:inta[3][4],(*p)[4];
p=a;
則:定義p是指向具有4個元素的一維數(shù)組的行指針,賦值后,p指向數(shù)組a。說明:定義標(biāo)識符所確定的變量為規(guī)定類型的指針變量,該指針變量只能指向一個包含n個元素的一維數(shù)組。運(yùn)算:行指針p+i,表示使行指針從當(dāng)前位置開始,向下移動i個相對移動量,每個相對移動量為一行。例輸出二維數(shù)組中的全部元素
—用行指針變量main(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int(*p)[4]=a,i,j;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",*(*(p+i)+j));printf("\n");}}例10.12(P228)另解§10.4字符串的指針和指向字符串的指針變量字符串有兩種表示形式:一維字符數(shù)組字符指針字符串的定義字符數(shù)組字符指針定義不初始化例:charstr[14];
定義一個字符型一維數(shù)組,分配連續(xù)14個字節(jié)的字符型存儲單元,數(shù)組名str為首地址例:char*str;
定義一個字符型指針變量,未分配字符型存儲單元,指針變量str無明確指向初始化例:charstr[]=
"IloveChina!";
定義一個字符型一維數(shù)組,分配連續(xù)14個字節(jié)的字符型存儲單元,數(shù)組名str為首地址例:char*str=
"IloveChina!";
定義一個字符型指針變量,分配連續(xù)14個字節(jié)的字符型存儲單元,其首地址存放在指針變量str中字符串的賦值(=)字符數(shù)組字符指針賦值整體賦值例:charstr[14];str="China!";是不合法的。
不允許對數(shù)組名賦值,因?yàn)閿?shù)組名是常量!例:char*str;str="China!";是合法的。
允許對字符型指針變量賦字符串,作用是分配連續(xù)7個字節(jié)的字符型存儲單元,其首地址存放在指針變量str中逐個字符賦值例:str[0]='C';或*str='C';str[1]='h';或*(str+1)='h';注意:數(shù)組名是數(shù)組的首地址,是個常量,不能為其賦值。字符串的輸入字符數(shù)組字符指針輸入整體輸入例:charstr[7];前提:字符指針有明確的指向
例:charc[7],*str=c;
例:char*str="China!";方法1)用scanf函數(shù):scanf("%s",str);
注意:所讀入的字符串中不能包含空格、TAB和回車。方法2)用gets函數(shù):gets(str);
注意:#include<stdio.h>,所讀入的字符串中可以包含空格和TAB。逐個字符輸入前提:字符指針有明確的指向例:for(i=0;(str[i]=getchar())!='\n';i++);
str[i]='\0';/*注意#include<stdio.h>*/字符串的輸入如果從鍵盤上輸入aabb↙,則a數(shù)組中各元素的值分別為:aabb\0aa\0舉例:charc[10];scanf("%s",c);如果從鍵盤上輸入aabb↙,則a數(shù)組中各元素的值分別為:字符串的輸出字符數(shù)組字符指針輸出整體輸出例:charstr[7]
="China!";例:charc[7],*str=c;
例:char*str="China!";方法1)用printf函數(shù):printf("%s\n",str);
注意:遇'\0'結(jié)束輸出。方法2)用puts函數(shù):puts(str);
注意:#include<stdio.h>;遇'\0'結(jié)束輸出并將'\0'作為回車換行('\n')處理。注:允許輸出串的右半段,例如:
printf("%s",str+2);puts(str+2);逐個字符輸出例:for(i=0;str[i]!='\0';i++)
printf("%c",str[i]));例:for(p=str;*p!='\0';p++)/*char*p;*/
putchar(*p);/*注意#include<stdio.h>*/§10.5函數(shù)的指針和指向函數(shù)的指針變量指針變量可以指向整型變量、字符串、數(shù)組,也可以指向一個函數(shù)。一、函數(shù)的指針函數(shù)的指針:一個函數(shù)在內(nèi)存中占一定的存儲空間,編譯時被分配一個入口地址,這個入口地址就稱為函數(shù)的指針。函數(shù)指針的表示:函數(shù)的指針用函數(shù)名來表示。二、指向函數(shù)的指針變量指向函數(shù)的指針的定義:
類型名(*函數(shù)指針變量名)();
如:float(*fun)();
定義fun是一個指向單精度型函數(shù)的指針變量。注意:1、(*fun)();不能寫成*fun(),因?yàn)?)優(yōu)先級高于*。
(*fun)()表示:①*先與fun結(jié)合,說明fun是指針變量。②然后再與()結(jié)合,說明該指針變量指向函數(shù)。2、定義后的指針不指向任何一個函數(shù),只有當(dāng)對指針變量賦值之后,才能指向特定的函數(shù)。三、指向函數(shù)的指針變量的使用為指向函數(shù)的指針變量賦值:函數(shù)指針變量名=函數(shù)名;如:float(*pf)();pf=max;
定義pf是一個指向單精度型函數(shù)的指針變量,pf指向函數(shù)max。()內(nèi)無指定形參列表,則pf可指向無形參列表的函數(shù)和含任意形式的形參列表的函數(shù)。若指定了,則只能指向含特定的形參列表的函數(shù)。指向函數(shù)的指針變量的使用:如果有:float(*pf)();pf=max;
則在程序中,(*pf)與max等價(jià)只給出函數(shù)名,后面不帶括號和參數(shù)例:求兩個數(shù)中的最大數(shù)(用指針調(diào)用函數(shù))max(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}main(){inta,b,c;int(*p)();p=max;scanf("%d,%d",&a,&b);c=(*p)(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c);}定義p是一個指向整型函數(shù)的指針變量將函數(shù)max的入口地址賦給指向函數(shù)的指針變量p用指針調(diào)用函數(shù)(*p)等價(jià)于max例10.23(P241)§10.7指針數(shù)組和指向指針的指針一個數(shù)組,如果其中的各個元素均為指針類型,則這個數(shù)組稱為指針數(shù)組。如果一個指針變量指向指針類型的數(shù)據(jù),則這個指針變量稱為指向指針的指針。一、指針數(shù)組指針數(shù)組的定義:類型名*數(shù)組名[常量表達(dá)式];
如:int*a[4];
表示數(shù)組a是一個具有4個元素的一維數(shù)組,每個數(shù)組元素都是一個指向整型數(shù)據(jù)的指針,即每個元素都是一個整型變量的地址。注意:指針數(shù)組和行指針在定義形式上的區(qū)別
int(*p)[4];行指針
int*p[4];指針數(shù)組一、指針數(shù)組main(){inta[10],*p[10],i,j;for(i=0;i<10;i++)p[i]=a+i;for(i=0;i<10;i++)*p[i]=i*i;for(i=0;i<10;i++)printf(“%8x,%5d\n”,p[i],*p[i]);}數(shù)組a的各元素的地址賦給指針數(shù)組p的各個元素為數(shù)組a的各元素賦值輸出a數(shù)組的第i個元素的地址和a數(shù)組第i個元素的值main(){voidsort(char*name[],intn);voidprint(char*name[],intn);char*name[]={"Followme","BASIC","GreatWall",
"FORTRAN","Compterdesign"};intn=5;sort(name,n);print(name,n);}例:將若干個字符串從小到大排序
(用指針數(shù)組)例10.27(P249)例:將若干個字符串從小到大排序
(用指針數(shù)組)voidsort(char*name[],intn){inti,j,k;char*temp;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)/*交換name[i]與name[k]的指向*/{temp=name[i];name[i]=name[k];name[k]=temp;}}}voidprint(char*name[],intn){inti;for(i=0;i<n;i++)printf("%s\n",name[i]);}sort函數(shù)的功能是用選擇法對具有n個元素的二維字符數(shù)組按升序排序print函數(shù)的功能是輸出具有n個元素的
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)內(nèi)部信息安全管理與保密合同
- 二零二五年度農(nóng)村土地承包經(jīng)營權(quán)與租賃權(quán)管理合同
- 2025版新材料研發(fā)企業(yè)新增股東協(xié)議書樣本3篇
- 2025年度住宅小區(qū)智能車位代理銷售及監(jiān)控系統(tǒng)合同4篇
- 2025年度物流企業(yè)司機(jī)勞務(wù)外包管理協(xié)議范本
- 二零二五年度旅游產(chǎn)品售后服務(wù)合同規(guī)范4篇
- 二零二五年度廚房設(shè)備銷售與品牌推廣合作合同3篇
- 珠海科技學(xué)院《東方人文經(jīng)典》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025版賣方汽車零部件購銷合同范本詳細(xì)2篇
- 二零二五版茶葉種植基地土壤改良與肥料施用合同3篇
- 平安產(chǎn)險(xiǎn)陜西省地方財(cái)政生豬價(jià)格保險(xiǎn)條款
- 銅礦成礦作用與地質(zhì)環(huán)境分析
- 30題紀(jì)檢監(jiān)察位崗位常見面試問題含HR問題考察點(diǎn)及參考回答
- 詢價(jià)函模板(非常詳盡)
- 《AI營銷畫布:數(shù)字化營銷的落地與實(shí)戰(zhàn)》
- 麻醉藥品、精神藥品、放射性藥品、醫(yī)療用毒性藥品及藥品類易制毒化學(xué)品等特殊管理藥品的使用與管理規(guī)章制度
- 一個28歲的漂亮小媳婦在某公司打工-被老板看上之后
- 乘務(wù)培訓(xùn)4有限時間水上迫降
- 2023年低年級寫話教學(xué)評語方法(五篇)
- DB22T 1655-2012結(jié)直腸外科術(shù)前腸道準(zhǔn)備技術(shù)要求
- GB/T 16474-2011變形鋁及鋁合金牌號表示方法
評論
0/150
提交評論