• 
    

    
    

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

      C語(yǔ)言指針教學(xué)中常見(jiàn)錯(cuò)誤分析

      2017-04-10 06:30:16段紅義
      電腦知識(shí)與技術(shù) 2017年4期
      關(guān)鍵詞:指針

      段紅義

      摘要:指針是C語(yǔ)言程序設(shè)計(jì)的重點(diǎn)和難點(diǎn)內(nèi)容,正確理解與使用指針是學(xué)好數(shù)據(jù)結(jié)構(gòu)等后繼專業(yè)課程的基礎(chǔ)。從指針的定義及使用出發(fā),通過(guò)舉例總結(jié)歸納指針使用過(guò)程中容易出錯(cuò)的地方及如何正確使用指針。

      關(guān)鍵詞:C語(yǔ)言;指針;指針引用

      中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)04-0077-02

      指針是C語(yǔ)言程序設(shè)計(jì)的重點(diǎn)和難點(diǎn)內(nèi)容之一,是學(xué)好數(shù)據(jù)結(jié)構(gòu)課程的基礎(chǔ),靈活掌握指針,可以編寫出簡(jiǎn)潔、緊湊、高效的程序。但是在實(shí)際教學(xué)中往往由于指針的概念抽象,學(xué)生理解起來(lái)比較困難,在使用過(guò)程中由于對(duì)指針概念的理解不到位,而經(jīng)常出錯(cuò),甚至犯一些不必要的錯(cuò)誤。本文針對(duì)初學(xué)指針的學(xué)生容易出錯(cuò)及混淆的地方,結(jié)合簡(jiǎn)單的例子談?wù)勅绾握_使用指針及指針使用過(guò)程中常見(jiàn)的錯(cuò)誤。

      1 指針概念的理解

      指針是C語(yǔ)言中一種特殊的數(shù)據(jù)類型,指的是存儲(chǔ)器內(nèi)存單元的地址,每個(gè)內(nèi)存單元都對(duì)應(yīng)著一個(gè)特定的地址編號(hào),一個(gè)內(nèi)存單元可以存放一個(gè)字節(jié)的數(shù)據(jù)(二進(jìn)制代碼),計(jì)算機(jī)是通過(guò)內(nèi)存單元地址訪問(wèn)內(nèi)存單元中所存儲(chǔ)的數(shù)據(jù)。由于計(jì)算機(jī)所處理的數(shù)據(jù)的類型各不相同,不同類型的數(shù)據(jù)在存放到計(jì)算機(jī)內(nèi)存時(shí)都會(huì)占用不同個(gè)數(shù)且連續(xù)的存儲(chǔ)單元,計(jì)算機(jī)讀取該數(shù)據(jù)時(shí)將根據(jù)該數(shù)據(jù)的第一個(gè)存儲(chǔ)單元地址(首地址)和該數(shù)據(jù)的類型(決定訪問(wèn)幾個(gè)內(nèi)存單元數(shù))訪問(wèn)這個(gè)數(shù)據(jù),以VC++6.0編譯器為例,char型數(shù)據(jù)占用1個(gè)存儲(chǔ)單元,int型數(shù)據(jù)占用4個(gè)連續(xù)的存儲(chǔ)單元,下面以例1為例進(jìn)行說(shuō)明。

      例1:int a,b;a=80;b=90;

      假設(shè)編譯系統(tǒng)為變量a分配的內(nèi)存單元的起始地址(首地址)為2050,變量a將占用2050~2053這四個(gè)連續(xù)的內(nèi)存地址所對(duì)應(yīng)的存儲(chǔ)單元;同樣假設(shè)為變量b分配的內(nèi)存單元起始地址(首地址)為2054,變量b將占用2054~2057這四個(gè)連續(xù)內(nèi)存單元。對(duì)于a=80;語(yǔ)句來(lái)說(shuō),系統(tǒng)先找到數(shù)據(jù)a的起始地址2050,然后,根據(jù)a變量的數(shù)據(jù)類型將數(shù)據(jù)80寫入2050~2053這四個(gè)內(nèi)存單元中, 變量b 的值90寫入2054~2057這四個(gè)連續(xù)內(nèi)存單元。這是由系統(tǒng)按照變量名稱進(jìn)行的數(shù)據(jù)訪問(wèn)(稱為數(shù)據(jù)直接訪問(wèn))(見(jiàn)圖1)。當(dāng)然,如果把變量a或b的起始地址放到指針變量p或q中,就可以間接通過(guò)變量p或q來(lái)訪問(wèn)變量a或b了(稱為數(shù)據(jù)間接訪問(wèn))(見(jiàn)圖2),這就是能夠利用指針變量訪問(wèn)數(shù)據(jù)的原因。下面通過(guò)指針變量的定義來(lái)說(shuō)明如何正確使用指針。

      2 指針變量的定義及正確使用

      指針變量定義的語(yǔ)法格式:<指針變量所指對(duì)象的類型>*<指針變量名>[=<初始化>];通過(guò)定義指針變量就可以來(lái)間接訪問(wèn)它所指向的對(duì)象。通過(guò)例2進(jìn)行說(shuō)明。

      例2:int a;int *p=&a;*p=30;

      語(yǔ)句int a;表示定義了一個(gè)普通的整形變量a,語(yǔ)句int *p=&a;表示定義了一個(gè)整型指針變量p,且其內(nèi)容為整型變量a的地址值,假設(shè)a的地址為2050。通過(guò)這兩條語(yǔ)句的定義,整型指針變量p就指向了整形變量a,那么就可以通過(guò)p間接訪問(wèn)其所指向的對(duì)象a了。語(yǔ)句*p=30;就是利用指針變量p訪問(wèn)數(shù)據(jù)a的方法,*稱為指針的間接引用運(yùn)算符,*p表示p所指向的對(duì)象即a,操作*p就像操作a一樣(操作結(jié)果見(jiàn)圖3),在給a賦值的時(shí)候可以使用a=30;也可以使用*p=30來(lái)操作。

      [\&\&圖3 利用指針變量p訪問(wèn)變量a\&圖4 指針未賦值錯(cuò)誤\&]

      2.1 指針變量在使用之前必須進(jìn)行賦值

      定義指針變量的目的是使用指針變量,即利用指針變量訪問(wèn)它所指向的對(duì)象,所以指針變量在使用之前必須有一個(gè)確定的值,即把一個(gè)同類型的地址賦值給指針變量。因?yàn)闆](méi)有賦值的指針變量其內(nèi)容是一個(gè)隨機(jī)的地址值,該地址所對(duì)應(yīng)的單元可讀性未知,把一個(gè)數(shù)據(jù)寫入該地址中,容易造成無(wú)法估計(jì)的錯(cuò)誤。

      例3:int *p;*p=80;在本例中,p在使用之前沒(méi)有進(jìn)行賦值,p沒(méi)有指向任何一個(gè)變量,其值為一個(gè)隨機(jī)的地址,假設(shè)編譯系統(tǒng)為p分配的值為1000,則執(zhí)行*p=80;后,將80寫入1000~1003這四個(gè)內(nèi)存單元中,有可能會(huì)造成對(duì)這四個(gè)內(nèi)存單元原數(shù)據(jù)的破壞,所以發(fā)生運(yùn)行錯(cuò)誤(見(jiàn)圖4)。可以進(jìn)行如下修改:

      int a,*p;p=&a;*p=80;

      2.2 指針變量與指針?biāo)笇?duì)象變量

      指針變量與指針?biāo)笇?duì)象變量是兩個(gè)不同的變量,它們的類型是不同的。如:int a,*p;p=&a;p與*p是兩個(gè)不同數(shù)據(jù),p是指針變量,而*p是p所指的對(duì)象即a。在指針定義過(guò)程中變量p前面的*表示p是一個(gè)指針變量,而在引用指針時(shí)*表示間接引用運(yùn)算符。在給指針賦值時(shí),不能把一個(gè)普通的整形值直接賦給指針變量。

      例4:int a=1000,*p;p=a;該例會(huì)提示類型不符錯(cuò)誤。因?yàn)閜的類型為int*型,而a的類型為int型??梢宰鋈缦滦薷膇nt a=1000,*p;p=&a;

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

      指針是有類型的,給指針賦值,不但必須是一個(gè)地址,而且應(yīng)該是一個(gè)與該指針類型相符的變量或常量的地址。

      例5:int *p;float a;p=&a;*p=80.5;printf("%f\n",a);本例試圖將p指向a,通過(guò)*p修改a的值,但是由于指針p與&a類型不符,因此輸出a的值并不是想要的結(jié)果,本例錯(cuò)在指針類型不符,p是一個(gè)整型指針變量,類型為int*,而&a是浮點(diǎn)型指針,類型為float *,故而不能通過(guò)一個(gè)指向整形的指針變量來(lái)操作非整形變量的數(shù)據(jù)。本例可做如下修改:float a=20.5,*p;p=&a;*p=80.5;printf("%f\n",a);。

      2.4 指針變量在操作數(shù)組元素時(shí)需注意的地方

      指針變量的一個(gè)重要的使用就是訪問(wèn)數(shù)組元素,當(dāng)一個(gè)指針變量指向一個(gè)一維數(shù)組時(shí),指針變量加上或減去1個(gè)整數(shù)n,得到的值將是該指針指向前或指向后n個(gè)數(shù)據(jù)元素的地址,而不是普通意義上的加減運(yùn)算。

      例6:int a [5]={1,2,3,4,5},*p=a;*p=10;p=p+1;*p=20;*p++=30;

      在本例中指針變量p的初始值為數(shù)組a的起始地址,即a[0]元素的地址。然后*p=10;使a[0]得值變?yōu)?0,執(zhí)行p=p+1;語(yǔ)句后,指針變量p將指向a[1]元素,故而*p=20;語(yǔ)句將使a[1]元素的值變?yōu)?0。最后一條語(yǔ)句的執(zhí)行過(guò)程為:由于*和++為相同優(yōu)先級(jí),并且結(jié)合性為從右向左結(jié)合,故而等價(jià)為執(zhí)行*(p++)=30;即等價(jià)于*p=30;p++;即先修改p指向?qū)ο骯[1]的值為30,而后將指針p加1,p最后將指向a[2]元素。如果最后一條語(yǔ)句為:*++p=30;則為*(++p)=30;等價(jià)于語(yǔ)句p=p+1;*p=30;使指針p先指向a[2]元素,然后修改a[2]元素的值為30。

      在利用指針訪問(wèn)數(shù)組元素時(shí),也要注意越界問(wèn)題,如例6所示,當(dāng)有語(yǔ)句*(p + 5 )或*(p - 1 )等書寫語(yǔ)句時(shí)都會(huì)發(fā)生數(shù)組元素訪問(wèn)越界的運(yùn)行錯(cuò)誤。

      2.5 數(shù)組名是指針常量,不能當(dāng)變量使用

      數(shù)組名也是一個(gè)指針,表示的是該數(shù)組的起始地址,即第一個(gè)數(shù)組元素的首地址。但是數(shù)組名是一個(gè)指針常量,其值在運(yùn)算過(guò)程中是不能修改的,只能作為右值來(lái)使用。

      例7:利用數(shù)組名訪問(wèn)數(shù)組元素

      int a [5]={10,20,30,40,50};

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

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

      該例通過(guò)指針?lè)ㄒ敵鰯?shù)組中的每一個(gè)元素,但是由于a是一個(gè)常量,值不能在運(yùn)算時(shí)進(jìn)行修改,因此該例錯(cuò)在*(a + +)上??梢赃M(jìn)行如下改正:

      printf(″%d″, *(a + i ));

      3 結(jié)束語(yǔ)

      指針是C語(yǔ)言的精華,內(nèi)容涉及比較多,在此只針對(duì)初學(xué)指針的學(xué)生容易出錯(cuò)的地方做了簡(jiǎn)單的舉例及說(shuō)明,在實(shí)際使用指針過(guò)程中,由于指針錯(cuò)誤往往比較隱蔽,難以發(fā)現(xiàn),所以必須通過(guò)大量地上機(jī)調(diào)試相關(guān)程序,才能弄清指針程序的細(xì)節(jié),提高指針的理解能力。

      參考文獻(xiàn):

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

      [2] 許永達(dá).C語(yǔ)言指針錯(cuò)誤的分析及調(diào)試[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013(3):153-156.

      [3] 楊智明.C語(yǔ)言指針使用分析[J].保山學(xué)院學(xué)報(bào),2012,31(2):67-70.

      [4] 夏偉偉.C語(yǔ)言指針用法的探討[J].電腦編程技巧與維護(hù),2014(21):12-13,21.

      猜你喜歡
      指針
      垂懸指針檢測(cè)與防御方法*
      偷指針的人
      郊游
      為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
      辨析指針數(shù)組與數(shù)組指針
      基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
      我們倆
      基于彩色區(qū)域識(shí)別快速報(bào)警指針識(shí)別算法
      淺析C語(yǔ)言指針
      軟件工程(2014年3期)2014-03-15 20:11:33
      ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
      南平市| 湖州市| 五台县| 天镇县| 陵川县| 确山县| 星子县| 金门县| 蕉岭县| 闵行区| 裕民县| 九寨沟县| 庆云县| 信阳市| 阳江市| 太仓市| 丹阳市| 铜山县| 图们市| 宁海县| 六安市| 合山市| 信阳市| 涿州市| 凤庆县| 海丰县| 塔城市| 龙川县| 曲麻莱县| 东源县| 区。| 木兰县| 延川县| 山东省| 滦南县| 泸溪县| 论坛| 冷水江市| 南川市| 顺平县| 上蔡县|