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

        ?

        論指針中需要認(rèn)真辨識的3組概念

        2020-10-21 05:40:48賴玲
        關(guān)鍵詞:存儲空間數(shù)組指針

        賴玲

        摘 要:通過對指針中3組容易混淆的概念研究,介紹了它們的辨識方法,以具體實(shí)例為依據(jù),介紹了對數(shù)據(jù)加工和處理的方法,有助于夯實(shí)編程基礎(chǔ),促進(jìn)編程能力的提高.

        關(guān)鍵詞:指針;地址;數(shù)組;函數(shù)

        中圖分類號:TP312? 文獻(xiàn)標(biāo)識碼:A? 文章編號:1673-260X(2020)03-0022-03

        指針是C語言中的一個(gè)重要概念,是其最具特色的部分,是C語言的精華,同時(shí)也是C語言的難點(diǎn).指針除了能動(dòng)態(tài)地分配地址,表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在調(diào)用函數(shù)的時(shí)候能夠得到1個(gè)以上的結(jié)果外,在系統(tǒng)軟件的設(shè)計(jì)也是非常重要的.筆者在實(shí)際的教學(xué)和學(xué)生的實(shí)際編程指導(dǎo)中發(fā)現(xiàn),很多學(xué)生對“指針變量的定義符”和“指針變量的取值運(yùn)算符”“指針函數(shù)”和“函數(shù)指針”“指針數(shù)組與數(shù)組指針”等概念混淆不清;認(rèn)真辨識有關(guān)概念,礪清它們間的相互關(guān)系,對于編制簡潔、緊湊、高效的應(yīng)用程序非常有用,下面談?wù)剳?yīng)該辨識的幾個(gè)概念.

        1 “指針變量的定義符”和“指針變量的取值運(yùn)算符”

        操作符“*”既可以用來作為指針變量的定義符,也可以用作指針變量的取值運(yùn)算符.要根據(jù)“*”操作符出現(xiàn)的位置進(jìn)行判斷.

        例1 int i=3, *p;

        p=&i;

        printf("%d",*p);

        scanf("%d",p);

        *p=5;

        程序的第一句“int i=3;*p;”定義了一個(gè)整型變量i和一個(gè)整型的指針變量p,i里面只能存放整型變量的值,p(這里P前面的操作符“*”就是指針變量的定義符)里面只能存放整型變量的地址,i的初始值為3,執(zhí)行“p=&i;”中的“&”是取地址操作符,“p=&i;”將i的地址存到指針變量p的空間里面,也可以理解為將指針變量p指向整型變量i的首地址,見圖1所示.

        程序中的第三句,以十進(jìn)制整數(shù)的形式輸出*p,對于*p理解十分重要,這里p前面的操作符“*”就是取值運(yùn)算符,就是p當(dāng)前所指向變量i的存儲空間里面存放的內(nèi)容3.第四句是向指針變量p所指向的空間輸入十進(jìn)制整型數(shù)據(jù),等價(jià)于scanf("%d",&a),第五句是用5覆蓋指針變量p所指存儲空間里面的內(nèi)容,等價(jià)于“i=5;”,因?yàn)閜是指向整型變量i的首地址,“*p=5;”就是將p當(dāng)前所指向變量i的存儲空間里面的內(nèi)容修改為5,這是間接尋址方式.

        這里辨識的原則:一級指針變量中存放目標(biāo)變量的地址,凡是在聲明的語句中出現(xiàn)的操作符“*”是指針變量定義符,如例1程序第1行中的操作符“*”;在操作和控制部分出現(xiàn)的操作符“*”就是取值運(yùn)算符,如例1程序第3行和第5行中的操作符“*”.

        對于取值的理解一定要注意取值的內(nèi)容,對于一級指針,取得內(nèi)容為“指針?biāo)赶虼鎯臻g里面的內(nèi)容”即存儲空間的值,對于二級指針或者多級指針有“取存儲空間的地址”和“取存儲空間里面的內(nèi)容”的區(qū)別.

        例2 int a,*p,**pp;

        a=22;

        p=&a;

        pp=&p;

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

        假設(shè)變量a的地址為4000,指針p的地址為4100,二級指針pp的地址為4800,a、p、pp三者的關(guān)系如圖2所示.

        由圖2可以看出,a的地址為4000,保存在指針變量p中,p指向a,p的地址為4100,保存在pp中,即二級指針pp指向指針變量p,此時(shí),要引用a的值,可以使用*p,也可以使用**pp.注意:雖然p、pp都是指針變量,但p和pp指向的內(nèi)容有著本質(zhì)上的不同,p指向的是普通變量的地址,pp只能指向指針變量的地址而不能指向普通變量的地址.

        也就是說,二級指針的指針變量中存放的是一級指針變量的地址,對于指針變量的定義符和一級指針一樣,只要是在聲明語句中出現(xiàn)的操作符“*”都是指針變量的定義符,例2中第1行中的操作符“*”和操作符“**”都是指針變量的定義符,第5行“printf("%p,%d",*pp,**pp);”中“*pp”的“*”和“**pp”前面的“*”是指針變量取值運(yùn)算符,只不過它們?nèi)≈档膬?nèi)容不一樣,“*pp”取的是目標(biāo)對象的地址,“**pp”也就是“*(*pp)”,取的是目標(biāo)對象的內(nèi)容.

        2 “指針數(shù)組”與“數(shù)組指針”

        2.1 “指針數(shù)組”

        對于給定的一個(gè)數(shù)組,其元素都是存放同一類型數(shù)據(jù)的地址,這樣的數(shù)組稱為“指針數(shù)組”. “指針數(shù)組”其本質(zhì)為數(shù)組,只不過數(shù)組元素是同一類型數(shù)據(jù)的地址.例如:

        int *p[4];

        這里定義了一個(gè)指針數(shù)組,該數(shù)組的每個(gè)元素是整形變量的地址.對于“*p[4]”可以這樣理解,由于“[ ]”操作符比“*”操作符的優(yōu)先級高,因此p先與操作符“[ ]”結(jié)合,形成p[4]形式,這顯然是數(shù)組的形式,表示p數(shù)組里面有4個(gè)元素,p[4]中的p再與前面的操作符“*”結(jié)合,“*”是指針類型定義符,表示此數(shù)組是個(gè)指針類型,每個(gè)數(shù)組元素都可以指向一個(gè)整型變量.*p[i]相當(dāng)于*(p[i]),都表示下標(biāo)為i元素的地址,因?yàn)椴僮鞣癧 ]”優(yōu)先級高于操作符“*”.

        注意:這里提到的優(yōu)先級,操作符“()”高于操作符“[ ]”高于操作符“*”.

        2.2 “數(shù)組指針”

        “數(shù)組指針”也稱為行指針,是指向數(shù)組地址的指針,其本質(zhì)為指針.其定義形式為:

        (*指針變量名)[長度]

        例如:int (*P)[n]

        這里操作符“()”的優(yōu)先級比操作符“[ ]”優(yōu)先級高,“(*P)”表示是個(gè)指針,再與操作符“[ ]”結(jié)合,表示“數(shù)組指針”,“長度”表示二維數(shù)組分解為多個(gè)一維數(shù)組時(shí),一維數(shù)組的長度,也就是二維數(shù)組的列數(shù).

        例3

        main()

        {int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

        int *q,(*p)[4];

        for(p=a;p

        { for(q=p[0];q

        printf("%5d",*q);

        }

        }

        本程序的目的是輸出二維數(shù)組的各元素,使用了普通的指針變量和二維數(shù)組的行指針,行指針指向二維數(shù)組的首地址(p=a),p++跳過的是一行,而不是一個(gè)元素.

        兩者的區(qū)別:數(shù)組指針只是一個(gè)指針變量,占有目標(biāo)對象一個(gè)地址的存儲空間;指針數(shù)組是多個(gè)指針變量,以數(shù)組的形式存儲在內(nèi)存當(dāng)中,占有多個(gè)指針的存儲空間.

        3 “指針函數(shù)”與“函數(shù)指針”

        3.1 指針函數(shù)

        指針函數(shù)是指返回值是指針的函數(shù),即本質(zhì)是一個(gè)函數(shù).函數(shù)返回值是某一類型的指針.其定義形式為:

        類型標(biāo)識符 *函數(shù)名(參數(shù)表)

        int *f(x,y);

        首先它是一個(gè)函數(shù),這個(gè)函數(shù)的返回值是一個(gè)地址值.

        3.2 函數(shù)指針

        如果在程序中定義了一個(gè)函數(shù),編譯器在程序編譯之后,會為每個(gè)函數(shù)分配一個(gè)入口地址,即該函數(shù)第一條指令的地址,這個(gè)地址就是函數(shù)的指針.函數(shù)指針是指向函數(shù)的指針變量,其本質(zhì)是一個(gè)指針變量.

        int (*f) (int x); /*聲明一個(gè)函數(shù)指針*/

        f=func; /*將func函數(shù)的首地址賦給指針f */

        一般情況下,我們可以用一個(gè)指針來保存這個(gè)地址,而這個(gè)指針就是函數(shù)指針,該指針可以看作是它指向函數(shù)的別名,所以我們可以用該指針來調(diào)用這個(gè)函數(shù).

        例4 用函數(shù)指針變量作函數(shù)參數(shù)實(shí)例,從鍵盤任意輸入兩個(gè)整數(shù),求其最大值.

        include"stdio.h"

        int max (int x,int y)

        {

        return x>=y?x:y;

        }

        void main()

        {

        int a,b,c;

        int (*p)(int x,int y);

        scanf("%d,%d",&a,&b);

        p=max;

        c=(*p)(a,b);

        printf("a=%d,b=%d,max=%d\n",a,b,c);

        }

        程序中max (int x,int y)是已經(jīng)定義的函數(shù),用來求兩個(gè)數(shù)的最大值.函數(shù)int (*p)(int x,int y)中p先與操作符“*”結(jié)合,是指針變量,然后再與后面的操作符“()”結(jié)合,表示此指針變量指向函數(shù),這個(gè)函數(shù)的返回值是個(gè)整數(shù).

        程序中的第11行“p=max;”將指針變量p指向了“max (int x,int y)”函數(shù)的入口地址,即p指向函數(shù)max ( ).a,b的值分別傳遞給x,y.函數(shù)的返回值是a,b的最大值.

        必須注意:(1)一個(gè)指向函數(shù)的指針必須確保該函數(shù)被定義且分配了內(nèi)存,否則它將指向一個(gè)空地址,這是程序設(shè)計(jì)的大忌!

        (2)要注意“int (*p)(int x,int y);”中第一個(gè)括號的位置.如果寫成 “int *p (int x,int y);”情形,由于操作符“( )”高于操作符“*”,這就不是一個(gè)指向函數(shù)的指針了,它就成了聲明聲明一個(gè)函數(shù),這個(gè)函數(shù)的返回值一個(gè)int類型的地址.

        (3)給函數(shù)的指針變量賦值時(shí)只賦函數(shù)名,不允許帶參數(shù).如第11行“p=max;”.

        (4)發(fā)生函數(shù)調(diào)用的時(shí)候可以通過函數(shù)名,也可以通過函數(shù)的指針,本例中的調(diào)用形式“c=(*p)(a,b);”用函數(shù)指針調(diào)用的參數(shù)與函數(shù)調(diào)用的參數(shù)完全一致,用函數(shù)指針變量調(diào)用函數(shù)時(shí),只需要將“(*p)”代替函數(shù)名.

        (5)對指向函數(shù)的指針變量不允許做加減運(yùn)算,如:p++、p—、p+n都是錯(cuò)誤的.

        4 使用指針,一定要注意指針當(dāng)前的指向

        使用指針可以方便訪問內(nèi)存,具有很強(qiáng)的靈活性,但在設(shè)計(jì)程序的時(shí)候,一定要留意指針當(dāng)前的指向.下面的程序企圖利用指針輸出數(shù)組中的元素.

        例5 利用指針知識給數(shù)組元素賦值,再將數(shù)組中的各元素輸出.

        main()

        { int i,*p,a[7];

        p=a;

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

        scanf("%d",p++);

        printf("\n");

        for(i=0;i<7;i++,p++)

        printf("%d",*p);

        }

        程序中的第一個(gè)for語句實(shí)現(xiàn)了對數(shù)組元素賦值的功能,for結(jié)束的時(shí)候,執(zhí)行“p++”,指針已經(jīng)指向數(shù)組以后的空間.執(zhí)行第二個(gè)for語句,由于p所指的空間不是數(shù)組a的起始地址,執(zhí)行目標(biāo)地址取值運(yùn)算符“*p”時(shí),就無法和數(shù)組元素建立聯(lián)系,所以,就實(shí)現(xiàn)不了項(xiàng)目所要求的具體功能,為了解決這個(gè)問題,必須在程序的第6行后添加“p=a;”指令,使指針變量p重新指向數(shù)組a的首地址,才能實(shí)現(xiàn)項(xiàng)目所要求的具體功能.

        5 結(jié)束語

        程序設(shè)計(jì)中涉及的概念很多,對數(shù)據(jù)加工和處理的方法也靈活多變,只有認(rèn)真厘清知識間的相互關(guān)系,認(rèn)真辨析指針中常用的有關(guān)概念,注意指針當(dāng)前的指向,腳踏實(shí)地認(rèn)認(rèn)真真的書寫每行程序,才是編寫出符合要求的程序.

        參考文獻(xiàn):

        〔1〕任正云,李素若.C語言程序設(shè)計(jì)(第三版)[M].北京:中國水利水電出版社,2016.

        〔2〕譚浩強(qiáng).C語言程序設(shè)計(jì)教程(第3版)[M].北京:高等教育出版社,2006.

        〔3〕徐士良,等.C語言程序設(shè)計(jì)教程(第三版)[M].北京:人民郵電出版社,2009.

        〔4〕[美]K.N.King著,呂秀峰,黃倩譯.C語言程序設(shè)計(jì):現(xiàn)代方法(第2版)[M].北京:人民郵電出版社,2010.

        〔5〕[美]Stephen Prata著,云巔工作室譯.C Primer Plus(第五版)中文版【M】.北京:人民郵電出版社,2005.

        〔6〕劉軍.C程序設(shè)計(jì)教學(xué)探討[J].電腦知識與技術(shù),2011(06).

        猜你喜歡
        存儲空間數(shù)組指針
        JAVA稀疏矩陣算法
        基于多種群協(xié)同進(jìn)化算法的數(shù)據(jù)并行聚類算法
        蘋果訂閱捆綁服務(wù)Apple One正式上線
        JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
        用好Windows 10保留的存儲空間
        偷指針的人
        為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
        尋找勾股數(shù)組的歷程
        基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識別
        電測與儀表(2015年5期)2015-04-09 11:30:42
        ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
        国产女人精品视频国产灰线| 久久精品国产自在天天线| 国产精品自拍盗摄自拍 | 亚洲人成伊人成综合网中文| 少妇高潮久久蜜柚av| 亚洲精品动漫免费二区| 337p日本欧洲亚洲大胆精品| 日本黄页网站免费大全| 国产成人精品人人做人人爽| 亚洲天堂av黄色在线观看| 人人妻人人澡人人爽欧美一区双| 日本高清aⅴ毛片免费| 2017天天爽夜夜爽精品视频| 日韩人妖干女同二区三区| 国产精品538一区二区在线| 极品粉嫩嫩模大尺度无码| 极品人妻少妇一区二区| 中文字幕色偷偷人妻久久一区| 特黄做受又硬又粗又大视频小说 | 久久久天堂国产精品女人| 亚洲色国产欧美日韩| 国产自偷亚洲精品页65页| 久久久亚洲精品蜜桃臀| 精品一区二区三区女同免费 | 国内自拍偷国视频系列| 在线天堂www中文| 91社区视频在线观看| 狼人狠狠干首页综合网| 精品国产yw在线观看| 好大好深好猛好爽视频免费| 伊人99re| 久久九九av久精品日产一区免费| av在线不卡免费中文网| 精品久久久久久久久午夜福利| 国产成人精品三级麻豆| 久草91这里只有精品| 亚洲最大成人综合网720p| 国产在线不卡一区二区三区| 日韩成人精品在线| 久久AⅤ天堂Av无码AV| 国产tv不卡免费在线观看|