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.

主站蜘蛛池模板: 老汉色老汉首页a亚洲| 九九线精品视频在线观看| 久久中文电影| 在线欧美a| 无码又爽又刺激的高潮视频| 97成人在线视频| 91精品免费久久久| 欧美性精品不卡在线观看| 欧美精品成人| 宅男噜噜噜66国产在线观看| 国产亚洲精品91| 久久女人网| 国产国语一级毛片在线视频| 亚洲妓女综合网995久久| 精品国产乱码久久久久久一区二区| 伊人久久婷婷| 亚洲一级毛片在线观播放| 亚洲国产日韩在线观看| 国产日韩欧美视频| 亚洲国产精品日韩av专区| 亚洲视频影院| 中文字幕首页系列人妻| 免费可以看的无遮挡av无码| 欧美国产日本高清不卡| 国产呦精品一区二区三区下载| www.91中文字幕| 久热99这里只有精品视频6| 黄片在线永久| 亚洲中文字幕国产av| 国产精品毛片在线直播完整版| 国产呦视频免费视频在线观看 | 香蕉网久久| 亚洲人成色77777在线观看| 欧美成人精品欧美一级乱黄| 国产91线观看| 国产欧美高清| 91精品伊人久久大香线蕉| 又爽又大又光又色的午夜视频| 日本妇乱子伦视频| 色欲色欲久久综合网| 国产H片无码不卡在线视频| 97色婷婷成人综合在线观看| 色窝窝免费一区二区三区 | 亚洲黄色高清| 国产69精品久久| 久久国产精品影院| 亚洲一区精品视频在线| 亚洲第一在线播放| 精品三级网站| 国产特一级毛片| 国产区免费精品视频| 国产精品视频系列专区| 国产成人午夜福利免费无码r| 国产性生大片免费观看性欧美| 欧美日韩国产成人高清视频| 2019年国产精品自拍不卡| 国产簧片免费在线播放| 亚洲第一视频网站| 亚洲一区二区三区香蕉| 国产va在线观看免费| 免费毛片全部不收费的| 成年免费在线观看| 国产又色又刺激高潮免费看| 亚洲IV视频免费在线光看| 国产精品爽爽va在线无码观看| 无码高清专区| 野花国产精品入口| 噜噜噜久久| 午夜毛片免费看| 无遮挡国产高潮视频免费观看| 在线观看国产精品日本不卡网| 麻豆精品久久久久久久99蜜桃| 全午夜免费一级毛片| 国产不卡在线看| 国产成人精品一区二区三在线观看| 国产欧美另类| 亚洲成在人线av品善网好看| 成年A级毛片| 亚洲一区二区在线无码| 成人午夜网址| 天天躁日日躁狠狠躁中文字幕| 亚洲综合第一页|