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

淺析C語言指針使用中的幾個常見錯誤

2016-11-28 16:24:02張爾謙武警警官學院四川成都610000
人間 2016年15期

張爾謙(武警警官學院,四川 成都 610000)

?

淺析C語言指針使用中的幾個常見錯誤

張爾謙
(武警警官學院,四川成都610000)

摘要:指針是C語言中的一個重要概念,也可以說是C語言的靈魂。指針的引入使C語言變得高效和靈活,同時也給使用者尤其是初學者帶來一定的困惑。本文對C語言指針使用中的幾個常見錯誤進行了分析。

關鍵詞:指針;數組;C語言

指針是C語言中的一個重要概念,也可以說是C語言的靈魂。指針的引入使C語言變得高效和靈活,同時也給使用者尤其是初學者帶來一定的困惑。在教學實踐中經常會發現C語言指針使用中的一些常見的具有典型性的錯誤,現列舉分析如下。

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

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

二、不能正確區別指針變量與數組名的使用方法

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

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

#include<stdio.h>

int main()

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

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

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

return 0;

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

將上述錯誤程序改寫如下,則能正確輸出數組a的各個元素的值:

#include<stdio.h>

int main()

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

p = a;

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

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

return 0;

三、不能正確區別字符指針變量與字符數組的使用方法

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

char a[]=”abcdefg”;/ /初始化字符數組a

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

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

#include<stdio.h>

int main()

{char a[]= " abcdefg";/ /初始化字符數組a

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

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

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

return 0;

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

char a[]= " abcdefg";/ /初始化字符數組a

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

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

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

再看下例:

# include<stdio.h>

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 n",s1,s2);

程序執行后的輸出結果是()。

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

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

四、結語

程序設計語言的學習是一個在糾錯中不斷提高的過程,了解C指針使用中常見的典型性錯誤并認真分析其原因有助于提高對C語言的理解水平和應用水平。

參考文獻:

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

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

[3]譚浩強.C程序設計(第四版)[M].北京:清華大學出版社,2010.

中圖分類號:TP311

文獻標識碼:A

文章編號:1671 -864X(2015)05 -0200 -01

主站蜘蛛池模板: 青青青国产视频手机| 色香蕉网站| 99999久久久久久亚洲| 最新国产成人剧情在线播放| 国产另类视频| 国产成人福利在线视老湿机| 久久国产精品77777| 欧美视频免费一区二区三区| 成人午夜久久| 毛片三级在线观看| 91av成人日本不卡三区| 日韩国产综合精选| 日韩在线影院| 久久婷婷色综合老司机| 亚洲福利网址| 国产中文一区二区苍井空| 久久熟女AV| 日韩AV手机在线观看蜜芽| 日本三级精品| 69av免费视频| 久久久久88色偷偷| 91成人在线免费视频| 国产三级a| 成人精品免费视频| 久久久久无码精品| 国产精品区视频中文字幕| 欧美三级自拍| 国产精品99久久久| 国产精品冒白浆免费视频| 免费Aⅴ片在线观看蜜芽Tⅴ| 国产人前露出系列视频| 特级毛片8级毛片免费观看| 国产在线观看91精品| 国产精品区网红主播在线观看| 久久国产拍爱| 亚洲 欧美 日韩综合一区| 色综合成人| 免费看一级毛片波多结衣| 欧美97欧美综合色伦图| 美女内射视频WWW网站午夜 | 精品三级在线| 91视频精品| 亚洲精品无码久久久久苍井空| 亚洲伦理一区二区| 这里只有精品在线播放| 久久综合九九亚洲一区| 久久国产免费观看| 五月天久久综合| 欧美v在线| 成人夜夜嗨| 亚洲精品动漫| 午夜视频日本| 国产乱子伦视频三区| 国产精品嫩草影院av| 国产视频入口| 蜜臀av性久久久久蜜臀aⅴ麻豆| 色欲综合久久中文字幕网| 天天操精品| 真实国产精品vr专区| 国产精品区网红主播在线观看| 最新国产午夜精品视频成人| 国产成人h在线观看网站站| 亚洲精品卡2卡3卡4卡5卡区| 美女视频黄又黄又免费高清| 亚洲精品国产成人7777| 国产精品成人第一区| 国产精品v欧美| 青青草原国产av福利网站| 久久综合色88| 国产剧情国内精品原创| 欧美色图久久| 无码'专区第一页| 亚洲不卡影院| 亚洲成综合人影院在院播放| 国产精品yjizz视频网一二区| 91极品美女高潮叫床在线观看| 婷婷综合在线观看丁香| 91精品视频在线播放| 日韩大乳视频中文字幕| 91久久天天躁狠狠躁夜夜| 欧美a在线看| 久久香蕉国产线看观看式|