• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

      2016-11-28 16:24:02張爾謙武警警官學院四川成都610000
      人間 2016年15期
      關鍵詞:數(shù)組指針

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

      ?

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

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

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

      關鍵詞:指針;數(shù)組;C語言

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

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

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

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

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

      int * p,a[]={1,2,3,4,5};其中a的值即為數(shù)組a中第一個元素的地址即&a[0],可以將指針p初始化為a(即p = a;等價于p =&a[0];),這樣指針p就指向數(shù)組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;

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

      將上述錯誤程序改寫如下,則能正確輸出數(shù)組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;

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

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

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

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

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

      #include<stdio.h>

      int main()

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

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

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

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

      return 0;

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

      char a[]= " abcdefg";/ /初始化字符數(shù)組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);

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

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

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

      四、結(jié)語

      程序設計語言的學習是一個在糾錯中不斷提高的過程,了解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

      猜你喜歡
      數(shù)組指針
      JAVA稀疏矩陣算法
      電腦報(2022年13期)2022-04-12 00:32:38
      垂懸指針檢測與防御方法*
      軟件學報(2020年6期)2020-09-23 07:31:52
      JAVA玩轉(zhuǎn)數(shù)學之二維數(shù)組排序
      電腦報(2020年24期)2020-07-15 06:12:41
      偷指針的人
      娃娃畫報(2019年5期)2019-06-17 16:58:10
      為什么表的指針都按照順時針方向轉(zhuǎn)動
      辨析指針數(shù)組與數(shù)組指針
      Excel數(shù)組公式在林業(yè)多條件求和中的應用
      尋找勾股數(shù)組的歷程
      基于改進Hough變換和BP網(wǎng)絡的指針儀表識別
      電測與儀表(2015年5期)2015-04-09 11:30:42
      ARM Cortex—MO/MO+單片機的指針變量替換方法
      且末县| 鲁甸县| 寿阳县| 柘荣县| 连州市| 博乐市| 康平县| 武城县| 隆回县| 巍山| 青海省| 高邑县| 正镶白旗| 九台市| 亳州市| 宜都市| 江孜县| 墨竹工卡县| 苗栗市| 于田县| 贞丰县| 新田县| 班戈县| 彭山县| 宜都市| 高尔夫| 兰州市| 嘉鱼县| 松滋市| 高州市| 长沙县| 平江县| 循化| 德化县| 静乐县| 边坝县| 青阳县| 民勤县| 辉县市| 兴国县| 康乐县|