亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

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

        ?

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

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

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

        關(guān)鍵詞:指針;數(shù)組;C語(yǔ)言

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

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

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

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

        指針變量是用來(lái)存放地址值的,而數(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è)地址常量。請(qǐng)看下例:

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

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

        #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ù)組的使用方法

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

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

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

        但前者是定義字符數(shù)組a并把字符串”abcdefg”中的字符逐個(gè)賦給數(shù)組a的各元素,而后者是將字符串的第一個(gè)元素的地址賦給p。雖然以上兩個(gè)賦值語(yǔ)句的機(jī)制并不相同但利用數(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ù)組都可以用字符串常量來(lái)初始化,并能利用指針變量和字符數(shù)組正確輸出,但二者的機(jī)制卻不相同。在C語(yǔ)言中,初始化字符指針時(shí)創(chuàng)建的字符串被定義為只讀,不能利用指針修改這個(gè)字符串的值。而由字符串常量初始化的數(shù)組是可以修改的,數(shù)組中的元素可以改變。例如:

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

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

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

        四、結(jié)語(yǔ)

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

        參考文獻(xiàn):

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

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

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

        中圖分類號(hào):TP311

        文獻(xiàn)標(biāo)識(shí)碼:A

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

        猜你喜歡
        數(shù)組指針
        JAVA稀疏矩陣算法
        垂懸指針檢測(cè)與防御方法*
        JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
        偷指針的人
        為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
        辨析指針數(shù)組與數(shù)組指針
        Excel數(shù)組公式在林業(yè)多條件求和中的應(yīng)用
        尋找勾股數(shù)組的歷程
        基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
        ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
        久久99久久久无码国产精品色戒| 国产精品国产精品国产专区不卡| 亚洲国产精品久久人人爱| 国产在线精品一区二区不卡| 人妻少妇精品无码系列| 日本成人精品一区二区三区| 日日摸夜夜添夜夜添高潮喷水| 欧美国产精品久久久乱码| 亚洲国产精品久久久久久网站| 亚洲av一区二区网址| 国产av自拍视频在线观看| 又粗又粗又黄又硬又深色的| 日本午夜国产精彩| 日本在线一区二区在线| 无码精品人妻一区二区三区漫画 | 国产精品白浆无码流出| 日韩人妻美乳中文字幕在线| 欧美嫩交一区二区三区| 国产又色又爽无遮挡免费| www.日本一区| 蜜桃精品视频一二三区| 欧美黑寡妇特a级做爰| 少妇高潮喷水正在播放| 国产三级精品三级在线观看粤语| 亚洲av网站在线观看一页| 超清精品丝袜国产自在线拍| 亚洲国产午夜精品乱码| 亚洲福利视频一区二区三区| 天天爽夜夜爽夜夜爽精品视频| 日本无遮挡吸乳呻吟视频| 亚洲va成无码人在线观看 | 边添小泬边狠狠躁视频| 四房播播在线电影| 亚洲AV无码成人精品区日韩密殿| 日本视频一区二区三区观看| 精品区2区3区4区产品乱码9| 国产av天堂成人网| 国产午夜精品av一区二区三| 波多野结衣av一区二区全免费观看 | 少妇极品熟妇人妻无码| 无码丰满熟妇浪潮一区二区av|