C語(yǔ)言重點(diǎn)-指針_第1頁(yè)
C語(yǔ)言重點(diǎn)-指針_第2頁(yè)
C語(yǔ)言重點(diǎn)-指針_第3頁(yè)
C語(yǔ)言重點(diǎn)-指針_第4頁(yè)
C語(yǔ)言重點(diǎn)-指針_第5頁(yè)
已閱讀5頁(yè),還剩31頁(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)介

計(jì)算機(jī)程序設(shè)計(jì)第八章

指針提綱指針的概念指針變量指針與數(shù)組指針與函數(shù)指針與內(nèi)存8.2指針的概念程序運(yùn)行時(shí),代碼和數(shù)據(jù)都要裝入內(nèi)存中(二進(jìn)制形式,以字節(jié)為基本單位)內(nèi)存也是以字節(jié)為單位編址不同類型的數(shù)據(jù)占用的內(nèi)存空間大小不同,如字符型1個(gè)字節(jié),單精度浮點(diǎn)數(shù)4個(gè)字節(jié),整型4個(gè)字節(jié)等,而且存儲(chǔ)形式不同(因此,同樣數(shù)量字節(jié)中的同樣數(shù)據(jù),按不同類型讀取時(shí)意義不同)執(zhí)行程序時(shí),CPU并不識(shí)別變量的名稱,而是通過(guò)其地址進(jìn)行操作程序一般通過(guò)變量名存取變量值(直接訪問(wèn)),但也可以通過(guò)地址操作變量——指針(pointer)間接訪問(wèn)8.3指針變量的定義指針變量也占據(jù)內(nèi)存空間,但指針變量的內(nèi)容是其所指變量的地址,因此只有依托其所指向的變量才有實(shí)際應(yīng)用指針變量使用指針運(yùn)算符“*”來(lái)定義指向關(guān)系,定義的一般形式:類型

*指針變量名;int*ip;char*next;float*fp;指針變量定義的注意事項(xiàng)指針變量定義時(shí)注明的類型,是指針?biāo)赶蜃兞康念愋投x了指針變量ip后,通過(guò)*ip來(lái)使用指針?biāo)赶虻膶?duì)象指針變量的取值是其所指向變量的地址,而地址是內(nèi)存單元的編號(hào),是帶有地址屬性的特殊整數(shù)不同類型變量不僅占用內(nèi)存的字節(jié)數(shù)不同,而且對(duì)內(nèi)存單元的起始地址也有不同要求,如char要求奇數(shù)地址,int、float、double要求偶數(shù)地址使用所指對(duì)象的類型來(lái)描述指針變量的目的是便于識(shí)別和使用指針?biāo)赶虻刂返膬?nèi)容,特別對(duì)于指針的位移操作具有重要意義關(guān)于指針變量的類型對(duì)于編譯系統(tǒng),指針類型的作用是用來(lái)獲取所指數(shù)據(jù)類型的長(zhǎng)度,并以此確定指針單位增量的長(zhǎng)度。即,當(dāng)對(duì)指針進(jìn)行增減時(shí),實(shí)際是希望指針向后或向前指向保存在同一片存儲(chǔ)區(qū)域中具有相同數(shù)據(jù)類型的其他單元的地址如:float*fp,x[]={1.0,2.0,3.0};

fp=&x[1];

則*fp=2.0,*(fp-1)=1.0,*(fp+1)=3.0

fp每次增減都在內(nèi)存中向后或向前移動(dòng)4個(gè)字節(jié)并按float類型訪問(wèn)該地址中的數(shù)據(jù)關(guān)于指針變量的類型(續(xù))不同類型的指針既不能互相轉(zhuǎn)換,也不能互相賦值(因不同類型數(shù)據(jù)在內(nèi)存中的存放方式不同)如:int*ip,i;float*fp,f;

ip=&i;fp=&f;//合法

ip=&f;fp=&i;//不合法注意,不管指向何種類型的對(duì)象,指針變量本身占用內(nèi)存的字節(jié)數(shù)都是一樣的,要能夠把程序中所能用的最大地址表示出來(lái)(通常是一個(gè)機(jī)器字長(zhǎng))指向復(fù)雜數(shù)據(jù)類型的指針char(*ptr)[5];//ptr是指向由5個(gè)字符元素構(gòu)成的數(shù)組的指針變量int**ip;//ip是一個(gè)“指向整型量的指針變量”的指針變量int*fip();//fip是返回整型指針的函數(shù)(函數(shù)聲明)int(*pti)();//pti是指向一個(gè)返回整數(shù)的函數(shù)的指針變量int*(*pfpi)();//pfpi是一個(gè)指向函數(shù)的指針變量,該函數(shù)返回指向整數(shù)的指針如何區(qū)分函數(shù)和指針?看運(yùn)算符的優(yōu)先級(jí)(前綴*優(yōu)先的是指針,int*fip()中()優(yōu)先級(jí)更高,因此不是指針)需要注意的是,以上只是定義指針變量,并不對(duì)應(yīng)實(shí)際的變量,必須對(duì)應(yīng)實(shí)際變量后才有意義8.4指針變量的引用與地址有關(guān)的運(yùn)算符取變量地址運(yùn)算符&間接訪問(wèn)運(yùn)算符*取變量地址運(yùn)算符&其操作對(duì)象必須是變量或數(shù)組元素(在內(nèi)存中有確切的單元地址),而不能是表達(dá)式或常量如scanf(“%d”,&a);是將鍵盤(pán)輸入的數(shù)字串轉(zhuǎn)換成十進(jìn)制整數(shù),送入變量a所在的地址單元間接訪問(wèn)運(yùn)算符*操作對(duì)象必須是指針變量或指針表達(dá)式,即,對(duì)象已指向內(nèi)存中確切的單元,如

inta,*p;p=&a;//指針p指向變量a則a=100;與*p=100;作用相同,后者表示取出p的值,然后把100放入p值所表示的內(nèi)存單元中而*p=*p+10也等價(jià)于a=a+10p是指針變量,*p則是指針?biāo)赶虻淖兞?如a)8.5指針變量的運(yùn)算指針變量是存放地址量的變量,地址量并不是整數(shù),地址量的加減并非整數(shù)的加減,而是表示內(nèi)存空間中按數(shù)據(jù)類型大小的前后移動(dòng)空指針和無(wú)效指針空指針NULL是C指針類型中的一個(gè)特殊值,表示指針變量的值為空,即不指向任何內(nèi)存單元,可用于初始化指針變量如:int*p=NULL;指針變量不能用其他值初始化無(wú)效指針是一個(gè)指針變量無(wú)值,如指針變量未賦值或指針運(yùn)算超出數(shù)組范圍關(guān)于指針變量的示例程序,見(jiàn)P211例8.1注意與指針相關(guān)的運(yùn)算:&*=P212指針的強(qiáng)制類型轉(zhuǎn)換,可實(shí)現(xiàn)不同類型指針變量間的交叉賦值(應(yīng)為float*f,x;),但只在特殊場(chǎng)合使用對(duì)字符的指針變量,可以使用字符串賦值如:char*ptr1;

ptr=“howareyou!”;//ptr指向該字符串首

個(gè)字符的內(nèi)存地址兩個(gè)指針可以相減,或進(jìn)行關(guān)系比較,但必須是相容指針(見(jiàn)P213和P214說(shuō)明)兩個(gè)指針不可以相加(無(wú)意義)指針運(yùn)算例:

int*p,*q,a[100];

p=&(a[10]);

則p+3指向的實(shí)際地址是&(a[10])+3*sizeof(int),即a[13]的地址*p++等價(jià)于*(p++),表示取出p當(dāng)前所指單元的內(nèi)容,然后p指向后繼元素(運(yùn)算符的優(yōu)先級(jí))*++p等價(jià)于*(++p),表示p指向后繼元素,再取出p所指單元的內(nèi)容例8.2按正向和反向順序打印一個(gè)字符串#include<stdio.h>main(){char*ptr1,*ptr2;ptr1=“HappyNewYear”;ptr2=ptr1;while(*ptr2!=0)putchar(*ptr2++);//正向打印

putchar(‘\n’);while(--ptr2>=ptr1)putchar(*ptr2);//反向打印

putchar(‘\n’);}//用內(nèi)存表示解釋例8.3用指針做函數(shù)參數(shù)實(shí)現(xiàn)字符串比較(C8-e3.c)#include<stdio.h>int

udf_strcmp(char*s,char*t);main(){

printf(“%d\n”,udf_strcmp(“a

string”,”astrange”));

printf(“%d\n”,udf_strcmp(“a

strange”,“astring”));

printf(“%d\n”,udf_strcmp(“a

string”,“astring”));}int

udf_strcmp(char*s,char*t){for(;*s==*t;s++,t++)if(*s==‘\0’)return(0);return(*s-*t);}8.6指向數(shù)組元素的指針地址稱為指針的說(shuō)法有問(wèn)題數(shù)組名是指針的說(shuō)法有問(wèn)題,數(shù)組名是一個(gè)符號(hào)地址常量,表示數(shù)組的首地址,是右值(證明程序c6-t1.c)ANSIC規(guī)定,在形參中數(shù)組名作為指針使用更多參見(jiàn)http:///forum.php?mod=viewthread&tid=2041392數(shù)組的元素視為變量,是左值,可以賦值指針是個(gè)變量,其變量值為某個(gè)變量或數(shù)組的地址inta[5],*iptr;則iptr=a;等價(jià)于iptr=&a[0];

inta[5]={9,8,7,6,5};

int*iptr;

iptr=a;在變量定義時(shí),*用來(lái)表示其后所跟的標(biāo)識(shí)符是一個(gè)指針變量名在表達(dá)式中,*是取地址中存放值的操作符,因此*iptr不能作為左值*(iptr+1)的運(yùn)算過(guò)程取出變量iptr的值,即數(shù)組a的首地址首地址加上1×sizeof(int),產(chǎn)生新的地址取該新地址中存放的值例8.4編寫(xiě)字符串復(fù)制函數(shù)udf_strcpy()voidudf_strcpy1(chars[],chart[]){//數(shù)組方式

inti=0;while((s[i]=t[i])!=‘\0’)i++;}voidudf_strcpy2(char*s,char*t){//指針?lè)绞?/p>

while((*s=*t)!=‘\0’){s++;t++;}}ANSIC工作組規(guī)定,不允許把整個(gè)數(shù)組作為函數(shù)參數(shù),而是傳遞數(shù)組名,并轉(zhuǎn)換為指針因此,實(shí)際使用中,一維數(shù)組名可以和指針變量混用voidudf_strcpy3(char*s,char*t){//指針?lè)绞?/p>

while((*s++=*t++)!=‘\0’);}進(jìn)一步,由于‘\0’與數(shù)值0等同voidudf_strcpy4(char*s,char*t){//指針?lè)绞?/p>

while((*s++=*t++));}例8.5將用戶輸入的數(shù)據(jù)放入數(shù)組中,然后輸出反置后數(shù)組的元素(C8-e5.c)要點(diǎn):采用遞歸算法,從數(shù)組首元素開(kāi)始,與尾元素互換,直至到達(dá)中間元素例8.6指針與數(shù)組的關(guān)系#include<stdio.h>main(){

inta[5]={1,2,3,4,5};

inti,*p;

for(i=0;i<5;i++)printf(“%6d”,a[i]);//下標(biāo)法

printf(“\n”);

for(i=0;i<5;i++)printf(“%6d”,*(a+i));//數(shù)組名法

printf(“\n”);

for(p=a;p<a+5;p++)printf(“%6d”,*p);//指針變量法

printf(“\n”);}以上訪問(wèn)方式結(jié)果相同,但執(zhí)行效率有差別下標(biāo)法和數(shù)組名法執(zhí)行效果相同,C編譯器將a[i]轉(zhuǎn)換為*(a+i)處理,即先計(jì)算元素地址再存取指針變量法最快,指針直接移向元素所在地址下標(biāo)法較直觀,數(shù)組名法和指針變量法不直觀,出錯(cuò)檢查和處理較復(fù)雜C程序員的常見(jiàn)做法若需要按嚴(yán)格的遞增或遞減順序訪問(wèn)數(shù)組,用指針效率高若隨機(jī)訪問(wèn)數(shù)組,用下標(biāo)簡(jiǎn)潔明了使用指針表示數(shù)組時(shí)的注意事項(xiàng)數(shù)組名不是指針,不能作為左值程序運(yùn)行過(guò)程中指針變量的當(dāng)前值#include<stdio.h>main(){

inti,a[10],*p;p=a;

for(i=0;i<10;i++)scanf(“%d”,p++);

for(i=0;i<10;i++)printf(“%6d”,*p++);

printf(“\n”);}//找錯(cuò),指針的訪問(wèn)是動(dòng)態(tài)的數(shù)組越界深入理解“++”“--”與指針變量的結(jié)合使用inta[10],*iptr,*q,u,v=5;iptr=&a[v];a[4]=40;a[5]=50;a[6]=60;q=iptr++;//q指向a[5],iptr指向a[6]u=*(iptr++);//u的值為50,iptr指向a[6]u=(*iptr)++;//u的值為50,iptr指向a[5],a[5]的值為51u=*iptr

溫馨提示

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