国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺析C語言指針使用中的幾個(gè)常見錯(cuò)誤

2015-01-04 06:02:58張爾謙
人間 2015年15期
關(guān)鍵詞:常量字符串數(shù)組

張爾謙

(武警警官學(xué)院,四川 成都 610000)

淺析C語言指針使用中的幾個(gè)常見錯(cuò)誤

張爾謙

(武警警官學(xué)院,四川 成都 610000)

指針是C語言中的一個(gè)重要概念,也可以說是C語言的靈魂。指針的引入使C語言變得高效和靈活,同時(shí)也給使用者尤其是初學(xué)者帶來一定的困惑。本文對C語言指針使用中的幾個(gè)常見錯(cuò)誤進(jìn)行了分析。

指針;數(shù)組; C語言

指針是C語言中的一個(gè)重要概念,也可以說是C語言的靈魂。指針的引入使C語言變得高效和靈活,同時(shí)也給使用者尤其是初學(xué)者帶來一定的困惑。在教學(xué)實(shí)踐中經(jīng)常會發(fā)現(xiàn)C語言指針使用中的一些常見的具有典型性的錯(cuò)誤,現(xiàn)列舉分析如下。

一、間接引用未初始化的指針

對于指針變量如果僅進(jìn)行了定義而未對其進(jìn)行初始化,則不可對其進(jìn)行間接訪問。例如int *p;*p=100;,這是初學(xué)者常犯的一個(gè)錯(cuò)誤。對于指針變量p進(jìn)行定義,僅僅是為p分配了一個(gè)存儲空間,而這個(gè)存儲空間里所存儲的值在沒有對p進(jìn)行初始化之前是不可預(yù)知的,而這個(gè)不可預(yù)知的值既然存儲在變量p中就自然被理解為是一個(gè)地址值。在這種情況下,執(zhí)行語句*p=100;就會改寫以這個(gè)存儲于p中的不可預(yù)知的值為地址的存儲單元里的內(nèi)容,而該存儲單元中可能存儲著一個(gè)重要的數(shù)據(jù),這樣就有可能破壞系統(tǒng)的運(yùn)行,造成嚴(yán)重后果。把上述錯(cuò)誤語句改為int *p, a;p=&a; *p=100;由于在對p進(jìn)行間接引用之前已對其進(jìn)行初始化,使指針p指向整型變量a,則不會出現(xiàn)上述錯(cuò)誤。

二、不能正確區(qū)別指針變量與數(shù)組名的使用方法

指針變量是用來存放地址值的,而數(shù)組名代表該數(shù)組第一個(gè)元素的地址。例如:

int *p,a={1,2,3,4,5};其中a的值即為數(shù)組a中第一個(gè)元素的地址即&a[0],可以將指針p初始化為a(即p=a;等價(jià)于p=&a[0];),這樣指針p就指向數(shù)組a的第一個(gè)元素a[0]。但是必須注意p是可以存放地址值的變量而a則是一個(gè)地址常量。請看下例:

#include

int main()

{ int i,a={1,2,3,4,5};

for (i=0;i<5;i++)

printf("%d ",*(a++));

return 0;

}

該程序段不能輸出數(shù)組a的元素的值,編譯時(shí)會給出出錯(cuò)提示“'++' needs l-value”(自增運(yùn)算符只能應(yīng)用于左值)原因在于a是一個(gè)常量,而常量不能作為左值,即不能出現(xiàn)在賦值符的左側(cè),不能進(jìn)行自增運(yùn)算。這是數(shù)組名與指針變量的重要區(qū)別。

將上述錯(cuò)誤程序改寫如下,則能正確輸出數(shù)組a的各個(gè)元素的值:

#include

int main()

{ int *p,i,a={1,2,3,4,5};

p=a;

for (i=0;i<5;i++)

printf("%d ",*(p++));

return 0;

}

三、不能正確區(qū)別字符指針變量與字符數(shù)組的使用方法

字符指針變量用來指向一個(gè)字符而字符數(shù)組可以由若干個(gè)數(shù)組元素組成,每個(gè)數(shù)組元素都可以存儲一個(gè)字符。從這一點(diǎn)上來看,二者并不容易混淆。但字符指針變量和字符數(shù)組都可以用字符串常量來初始化,這時(shí)就要特別注意二者的區(qū)別了。例如下面對字符指針變量和字符數(shù)組的初始化都是合法的:

char a=”abcdefg”; //初始化字符數(shù)組a

char * p=”abcdefg”;//初始化指針變量p

但前者是定義字符數(shù)組a并把字符串”abcdefg”中的字符逐個(gè)賦給數(shù)組a的各元素,而后者是將字符串的第一個(gè)元素的地址賦給p。雖然以上兩個(gè)賦值語句的機(jī)制并不相同但利用數(shù)組a和指針p都能輸出字符串”abcdefg”。下面的程序輸出兩次字符串”abcdefg”:

#include

int main()

{char a="abcdefg";//初始化字符數(shù)組a

char * p="abcdefg";//初始化指針變量p

printf("%s ",a);//利用數(shù)組輸出字符串

printf("%s ",p);//利用指針輸出字符串

return 0;

}

字符指針變量和字符數(shù)組都可以用字符串常量來初始化,并能利用指針變量和字符數(shù)組正確輸出,但二者的機(jī)制卻不相同。在C語言中,初始化字符指針時(shí)創(chuàng)建的字符串被定義為只讀,不能利用指針修改這個(gè)字符串的值。而由字符串常量初始化的數(shù)組是可以修改的,數(shù)組中的元素可以改變。例如:

char a="abcdefg";//初始化字符數(shù)組a

char * p="abcdefg";//p指向字符串常量的第//一個(gè)字符

a[2]=’f’;//合法

p[2]=’f’;//非法,字符串常量不能改變

再看下例:

# include

void swap(char *x,char *y)

{ char t;

t=*x; *x=*y; *y=t;

}

void main( )

{ char *s1="abc",*s2="123";

swap(s1,s2); printf("%s,%s ",s1,s2);

}

程序執(zhí)行后的輸出結(jié)果是()。

A)123,abc B)abc,123 C)1bc,a23 D)321,cba

這是2006年4月二級C語言試題第38題,標(biāo)準(zhǔn)答案是C。筆者認(rèn)為這是一道值得商榷的題目。通過實(shí)驗(yàn)驗(yàn)證該程序可通過編譯但不能正常運(yùn)行,更不能得出選項(xiàng)C所給出的結(jié)果。原因就在于初始化字符指針s1時(shí)創(chuàng)建的字符串"abc"和初始化字符指針s2時(shí)創(chuàng)建的字符串"123"被系統(tǒng)定義為只讀,不能利用指針修改這個(gè)字符串的值。

四、結(jié)語

程序設(shè)計(jì)語言的學(xué)習(xí)是一個(gè)在糾錯(cuò)中不斷提高的過程,了解C指針使用中常見的典型性錯(cuò)誤并認(rèn)真分析其原因有助于提高對C語言的理解水平和應(yīng)用水平。

[1]Peter Van Der Linden著,許波譯.C專家編程[M].北京:人民郵電出版社,2008.

[2]Kenneth A. Reek著,許波譯.C和指針[M].北京:人民郵電出版社,2008.

[3]譚浩強(qiáng).C程序設(shè)計(jì)(第四版)[M].北京:清華大學(xué)出版社,2010.

TP311

A

1671-864X(2015)05-0200-01

猜你喜歡
常量字符串數(shù)組
科學(xué)照亮世界
——卡文迪什測定萬有引力常量
JAVA稀疏矩陣算法
JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
低氧低分壓環(huán)境下泡塑吸附火焰原子吸收光譜法測定常量金
西藏科技(2015年1期)2015-09-26 12:09:20
尋找勾股數(shù)組的歷程
一種新的基于對稱性的字符串相似性處理算法
依據(jù)字符串匹配的中文分詞模型研究
VB數(shù)組在for循環(huán)中的應(yīng)用
考試周刊(2012年88期)2012-04-29 04:36:47
論常量函數(shù)的充分必要條件
一種針對Java中字符串的內(nèi)存管理方案
汨罗市| 老河口市| 彩票| 灯塔市| 木里| 正阳县| 岢岚县| 寿光市| 黄大仙区| 开封县| 遂宁市| 城市| 南召县| 寿光市| 虞城县| 乐至县| 潞西市| 双柏县| 克拉玛依市| 嘉黎县| 白山市| 突泉县| 北安市| 富蕴县| 平昌县| 漠河县| 宣威市| 静乐县| 成都市| 金华市| 大埔区| 鲁山县| 鄂尔多斯市| 神木县| 白城市| 栖霞市| 博湖县| 友谊县| 宁都县| 台山市| 武城县|