999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C語言中指針應用的常見問題

2010-12-31 00:00:00趙長青黃書童
考試周刊 2010年42期

摘 要: 指針的應用在C語言中既是重點又是難點,本文作者對指針使用中出現的常見問題作了簡要的歸納、分析、總結,希望能對C語言初學者起到一定的幫助作用。

關鍵詞: C語言 指針 應用 常見問題

指針是C語言中的一個重要概念,指針的應用也是C語言中最重要的一個內容。具有指針類型的變量(即指針變量)可以存放其他變量的地址,能有效地表示數據之間復雜的邏輯關系。正確而靈活地運用指針可以給程序設計帶來許多方便,比如可以有效地表示復雜的數據結構、動態分配內存、方便地使用字符串,在調用函數時能夠得到多于一個的和可以直接處理內存地址等。

能否正確理解和使用指針是我們是否掌握C語言的一個標志。但是由于指針太過靈活,一旦使用不當,不僅錯誤難查,而且會出現意想不到的錯誤。因此,要編出正確而高效的程序,必須正確地理解和使用指針。本文著重分析了指針應用中的若干常見問題,以幫助初學者更好地掌握指針。

一、指針變量在初始化時應注意的問題

1.“*”在使用時有不同的含義:在聲明變量時用在變量的前面,其作用是說明該變量為指針變量,其它情況用在指針變量前面作為指針運算符。

如:int *P,i=5;(*用在P前面,說明P為指針變量)

P=i;

printf(“%d\”,*P);(*用在P前面。作為指針運算符)

又如:int *p=1;等價于int *p;p=1;兩條語句的組合。

2.不能給未初始化的指針賦值。

main( )

{int i,*P;

i=5;

*P=8;

return 0;

}

指針在未初始化的時候,它的指向是不確定的,因此對它的運算是不正確的。也有可能會帶來“災難性”的后果,在使用指針前要使它有個確切的指向,在語句i=5和*P=8之間加一條語句P=i即可,這樣就讓指針變量P有了明確的指向。

二、指針變量在賦值時應注意的問題

1.給指針變量賦值必須是地址值[1],不能賦予任何其它數據。C語言中提供了地址運算符“”來表示變量的地址。其一般形式為:變量名;如a表示變量名a的地址。

例如:int b;int *p;p=b;此為正確的賦值方法。但有時會有如下錯誤書寫:int *p;p=156;這樣就使指針p指向了地址156(十進制),編譯時系統會提示出錯。

2.不同類型的指針不能相互賦值

指針是具有具體類型的,在給指針賦值時,不但要求是地址,而且應該是一個與該指針類型相符的變量或者常量的地址。

例如:“int *p;float a=3.4,*q=a;p=q;”以上語句中在“p=q;”這條語句上存在錯誤,因為p是一個整型指針,只能存放int型數據的地址,而q指向的是一個實數型變量,里面存放的是float型數據。二者不相匹配,因此在編譯時會發生錯誤。

三、指針變量用于數組時應注意的問題

1.數組名與指針變量的區別。指針常用于數組中,數組名代表數組的起始地址[2]。可將數組名賦給一個指針變量,即該指針變量指向了該數組,從而使得訪問數組可以采用地址法(訪問數組元素還可用下標法)。指向數組的指針變量可以作加減法的運算,且只有指向同一數組,兩個指針變量可作減法(結果為相隔的元素個數)及關系運算。

如:int a[5]={1,2,3,4,5),*p;若有這樣的語句:for(p=a;p

2.使用指針法訪問數組元素時,要注意“下標是否越界”的問題。p+5表示a+4下面的一個整型單元。這樣會破壞有用的數據,產生不應有的后果,嚴重地造成死機,c編譯系統并不指出“下標越界”這樣的錯誤。

3.使用指向數組元素的指針變量時,應注意指針變量的當前值。如p=a;for(i=0;i<5;i++)scanf(“%d”,p++)。若缺少“p=a;”這一語句,則p的值是一個不確定的值,它的指向不確定。有可能將輸入的5個數據輸入到難以預料的存儲單元中去,可能造成“災難性”的后果。

4.兩個指針相加產生錯誤。兩個指針是不能相加的。如果你的C程序試圖將兩個指針相加,譯程序就會發出警告。當你試圖將一個指針和另外兩個指針的差值相加的時候,你很可能會誤將其中的兩個指針相加。例如,你很可能會使用語句:p=p+p2-p1。這個語句是不正確的,因為它和語句p=(p1+p2)-pl完全相同,正確語句應該是:p=p+(p2-p1)。

四、指針變量用于函數時應注意的問題

函數的返回值不僅可以是一般的數據類型,還可以為指針類型,這種帶回的類型為指針的函數稱為指針函數[3]。對于函數帶回的指針,這個指針所指示的存儲單元必須是存在的,不可以不存在。例如:

int *max(int x,int y)

{int *p;

if(x>y)p=x;

else p=y;

return p;

}

main( )

{int a,b,*m;

scanf(“%d%d”,a,b);

m=max(a,b);

printf(“MAX=%d\”,*m);

}

max是指針函數。編寫該函數的本意是由指針P帶回x、y中較大數的地址,但函數max執行完畢,返回主函數main時x、y所占用的存儲單元已被釋放,而P帶回的將是一個不存在的存儲單元,這樣做顯然是不正確的。因此,程序應該改為:

int *max(int *x,int *y)

{int *p;

if(*x>*y)p=x;

else p=y;

return p;

}

main( )

{int a,b,*m;

scanf(“%d%d”,a,b);

m=max(a,b);

printf(“MAX=%d\”,*m);

}

這樣修改后,max函數中的指針P帶回的則是主函數main中a,b兩者中較大數的地址,就可以正確輸出了。可見指針函數中帶回的指針應該是主調函數中變量的地址,不能是已釋放空間的地址。

熟練掌握指針可以編寫靈活的程序,但是誤用指針可能會造成嚴重的破壞,要透徹地理解,謹慎地使用指針,我們還需要在上機實踐中不斷地摸索、總結。

參考文獻:

[1]王聲決,羅堅.C語言程序設計[M].北京:中國鐵道出版社,2002.

[2]譚浩強,周海燕,馮玉山,崔武子等.C語言程序設計[M].北京:華夏出版社,2005.6.

[3]譚浩強.C語言程序設計[M].北京:清華大學出版社,2002.

主站蜘蛛池模板: 亚洲经典在线中文字幕| 久久综合伊人 六十路| 中文字幕无码制服中字| 九九热精品在线视频| 自偷自拍三级全三级视频| 欧美日韩另类国产| 亚洲av中文无码乱人伦在线r| 免费a在线观看播放| 色老二精品视频在线观看| 日韩小视频网站hq| 免费无码一区二区| 欧美激情福利| 国产精品福利社| 天堂在线视频精品| 国产91精品调教在线播放| 高h视频在线| 97超爽成人免费视频在线播放| 国产丝袜无码一区二区视频| 亚洲精品少妇熟女| 91国内视频在线观看| 青青青国产视频| 无码精油按摩潮喷在线播放| 欧美日韩成人在线观看| 亚洲aaa视频| 欧美午夜视频在线| 97人妻精品专区久久久久| 2021精品国产自在现线看| 四虎在线高清无码| 亚洲精品老司机| 国产成在线观看免费视频| 99青青青精品视频在线| 97国产成人无码精品久久久| 午夜毛片免费观看视频 | 亚洲天堂日本| 国产麻豆91网在线看| 天天色天天综合网| 精品久久777| h网站在线播放| 欧美自拍另类欧美综合图区| 免费在线国产一区二区三区精品| 欧美中文一区| 欧美无遮挡国产欧美另类| 激情乱人伦| 日韩免费毛片视频| 无码AV日韩一二三区| 制服丝袜一区二区三区在线| 成人亚洲国产| 漂亮人妻被中出中文字幕久久| 国产在线观看人成激情视频| 99精品免费欧美成人小视频| 波多野衣结在线精品二区| 国产麻豆aⅴ精品无码| 四虎影院国产| 国产女主播一区| 高清不卡毛片| 国产91熟女高潮一区二区| a天堂视频| 97影院午夜在线观看视频| 久久精品丝袜| 日韩A∨精品日韩精品无码| 国产成人免费观看在线视频| 亚洲系列无码专区偷窥无码| 久久福利片| 日韩国产一区二区三区无码| 午夜在线不卡| 亚洲av无码人妻| 亚洲精品日产精品乱码不卡| 亚洲综合二区| 99热免费在线| 青青草原国产一区二区| 毛片网站在线看| 久久精品无码一区二区日韩免费| 欧美精品成人一区二区视频一| 91小视频在线观看| 欧美第九页| 日韩AV手机在线观看蜜芽| 亚洲精品国偷自产在线91正片| 国产美女91呻吟求| 欧美一区二区三区国产精品| 成人无码一区二区三区视频在线观看 | 久久9966精品国产免费| 日韩在线永久免费播放|