久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 深入理解指針之必看
深入理解指針之必看
時間:2016-12-12作(zuo)者:華清(qing)遠見

一.指針的概念

指(zhi)針(zhen)是(shi)一個特(te)殊的(de)變量,它(ta)里面存(cun)儲(chu)的(de)數值被(bei)解釋成(cheng)為內存(cun)里的(de)一個地址。

要搞清(qing)一個指(zhi)(zhi)針(zhen)需要搞清(qing)指(zhi)(zhi)針(zhen)的四(si)方面的內(nei)容:指(zhi)(zhi)針(zhen)的類型(xing),指(zhi)(zhi)針(zhen)所指(zhi)(zhi)向的類型(xing),指(zhi)(zhi)針(zhen)的值(zhi)或者叫指(zhi)(zhi)針(zhen)所指(zhi)(zhi)向的內(nei)存區(qu),還有指(zhi)(zhi)針(zhen)本身所占據的內(nei)存區(qu)。

1. 指針的類型

從語法的角度看,你只要把指針聲明語句里的指針名字去掉,剩下的部分就是這個指針的類型。這是指針本身所具有的類型。讓我們看看例一中各個指針的類型:
        (1)int *ptr; //指針的類型是int *
        (2)char *ptr; //指針的類型是char *
        (3)int **ptr; //指針的類型是 int **
        (4)int (*ptr)[3]; //指針的類型是 int(*)[3]
        (5)int *(*ptr)[4]; //指針的類型是 int *(*)[4]

2.指針所指向的類型

從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符 *去掉,剩下的就是指針所指向的類型。例如:
        (1)int *ptr; //指針所指向的類型是int
        (2)char *ptr; //指針所指向的的類型是char
        (3)int **ptr; //指針所指向的的類型是 int *
        (4)int (*ptr)[3]; //指針所指向的的類型是 int()[3]
        (5)int *(*ptr)[4]; //指針所指向的的類型是 int *()[4]

在(zai)指針(zhen)的算(suan)術運算(suan)中(zhong),指針(zhen)所指向的類(lei)型有很大的作(zuo)用。

指(zhi)(zhi)(zhi)針(zhen)(zhen)的(de)(de)(de)類(lei)(lei)(lei)型(xing)(xing)(即指(zhi)(zhi)(zhi)針(zhen)(zhen)本(ben)身的(de)(de)(de)類(lei)(lei)(lei)型(xing)(xing))和指(zhi)(zhi)(zhi)針(zhen)(zhen)所指(zhi)(zhi)(zhi)向的(de)(de)(de)類(lei)(lei)(lei)型(xing)(xing)是(shi)(shi)兩個(ge)概(gai)念。當(dang)你對C越來越熟悉時,你會發現,把(ba)(ba)與指(zhi)(zhi)(zhi)針(zhen)(zhen)攪和在一(yi)(yi)(yi)(yi)起(qi)的(de)(de)(de)"類(lei)(lei)(lei)型(xing)(xing)"這(zhe)個(ge)概(gai)念分成"指(zhi)(zhi)(zhi)針(zhen)(zhen)的(de)(de)(de)類(lei)(lei)(lei) 型(xing)(xing)"和"指(zhi)(zhi)(zhi)針(zhen)(zhen)所指(zhi)(zhi)(zhi)向的(de)(de)(de)類(lei)(lei)(lei)型(xing)(xing)"兩個(ge)概(gai)念,是(shi)(shi)精通指(zhi)(zhi)(zhi)針(zhen)(zhen)的(de)(de)(de)關鍵點之一(yi)(yi)(yi)(yi)。指(zhi)(zhi)(zhi)針(zhen)(zhen)存(cun)儲的(de)(de)(de)是(shi)(shi)一(yi)(yi)(yi)(yi)個(ge)地(di)址,這(zhe)個(ge)地(di)址是(shi)(shi)某(mou)一(yi)(yi)(yi)(yi)塊內存(cun)的(de)(de)(de)地(di)址,這(zhe)個(ge)地(di)址里放的(de)(de)(de)一(yi)(yi)(yi)(yi)定(ding)是(shi)(shi)一(yi)(yi)(yi)(yi)個(ge)數據(ju),這(zhe)個(ge)數據(ju)是(shi)(shi)有(you)類(lei)(lei)(lei)型(xing)(xing)的(de)(de)(de),我(wo)們所知,int型(xing)(xing)占(zhan)四(si)個(ge)字節(jie),char就占(zhan)一(yi)(yi)(yi)(yi)個(ge)字節(jie)等等,當(dang)你通過指(zhi)(zhi)(zhi)針(zhen)(zhen)來訪問指(zhi)(zhi)(zhi)針(zhen)(zhen)所指(zhi)(zhi)(zhi)向的(de)(de)(de)內存(cun)區時,指(zhi)(zhi)(zhi)針(zhen)(zhen)所指(zhi)(zhi)(zhi)向的(de)(de)(de)類(lei)(lei)(lei)型(xing)(xing)決(jue)定(ding)了編譯器將把(ba)(ba)那片內存(cun)區里的(de)(de)(de)內容當(dang)做(zuo)什么(me)來看(kan)待。int型(xing)(xing)就取(qu)四(si)個(ge)字節(jie),char就取(qu)一(yi)(yi)(yi)(yi)個(ge)字節(jie),這(zhe)個(ge)在做(zuo)指(zhi)(zhi)(zhi)針(zhen)(zhen)運算(suan)時,非常重要(yao)(yao),需(xu)要(yao)(yao)特別注意(yi)。

3. 指針的值

指(zhi)(zhi)針(zhen)(zhen)的(de)值(zhi)(zhi),或者叫指(zhi)(zhi)針(zhen)(zhen)所(suo)指(zhi)(zhi)向的(de)內(nei)存(cun)區或地址。 指(zhi)(zhi)針(zhen)(zhen)的(de)值(zhi)(zhi)是指(zhi)(zhi)針(zhen)(zhen)本身存(cun)儲的(de)數值(zhi)(zhi),這個(ge)值(zhi)(zhi)將被編譯(yi)器當(dang)作(zuo)一個(ge)地址,而不是一個(ge)一般的(de)數值(zhi)(zhi)。在32位程(cheng)序(xu)里,所(suo)有類型的(de)指(zhi)(zhi)針(zhen)(zhen)的(de)值(zhi)(zhi)都是一個(ge)32位整(zheng)數,因為32位程(cheng)序(xu)里內(nei)存(cun)地址全(quan)都是32位長。

指(zhi)(zhi)(zhi)(zhi)針所指(zhi)(zhi)(zhi)(zhi)向的(de)內(nei)存(cun)區就(jiu)是(shi)從指(zhi)(zhi)(zhi)(zhi)針的(de)值(zhi)(zhi)所代表(biao)的(de)那個(ge)(ge)內(nei)存(cun)地址開始,長(chang)度為sizeof(指(zhi)(zhi)(zhi)(zhi)針所指(zhi)(zhi)(zhi)(zhi)向的(de)類型)的(de)一(yi)片內(nei)存(cun)區。以后,我們說(shuo)一(yi)個(ge)(ge)指(zhi)(zhi)(zhi)(zhi)針的(de)值(zhi)(zhi)是(shi)XX,就(jiu) 相當(dang)于(yu)說(shuo)該指(zhi)(zhi)(zhi)(zhi)針指(zhi)(zhi)(zhi)(zhi)向了以XX為首地址的(de)一(yi)片內(nei)存(cun)區域(yu)(yu);我們說(shuo)一(yi)個(ge)(ge)指(zhi)(zhi)(zhi)(zhi)針指(zhi)(zhi)(zhi)(zhi)向了某塊(kuai)內(nei)存(cun)區域(yu)(yu),就(jiu)相當(dang)于(yu)說(shuo)該指(zhi)(zhi)(zhi)(zhi)針的(de)值(zhi)(zhi)是(shi)這塊(kuai)內(nei)存(cun)區域(yu)(yu)的(de)首地址。

指(zhi)(zhi)(zhi)針所(suo)指(zhi)(zhi)(zhi)向(xiang)的(de)內存區和指(zhi)(zhi)(zhi)針所(suo)指(zhi)(zhi)(zhi)向(xiang)的(de)類型是兩(liang)個完全不同(tong)的(de)概念。在(zai)例一中,指(zhi)(zhi)(zhi)針所(suo)指(zhi)(zhi)(zhi)向(xiang)的(de)類型已經(jing)有(you)了,但由于指(zhi)(zhi)(zhi)針還未初始化,所(suo)以它所(suo)指(zhi)(zhi)(zhi)向(xiang)的(de)內存區是不存在(zai)的(de),或者說是無意義的(de)。

以后,每(mei)遇到一個指(zhi)針(zhen),都應該問問:這(zhe)個指(zhi)針(zhen)的(de)類型是(shi)什么(me)?指(zhi)針(zhen)指(zhi)向的(de)類型是(shi)什么(me)?該指(zhi)針(zhen)指(zhi)向了哪里?

4. 指針本身所占據的內存區。

指(zhi)針(zhen)本(ben)身(shen)占了多大的(de)內(nei)存?你只要用函數(shu)sizeof(指(zhi)針(zhen)的(de)類(lei)型)測一下就知道了。在32位平臺里,指(zhi)針(zhen)本(ben)身(shen)占據了4個字節的(de)長(chang)度。

指(zhi)針本身占據的內(nei)存這個概念在判斷一個指(zhi)針表達式(shi)是(shi)否是(shi)左(zuo)值(zhi)時很有用。

二.指針的算術運算

指(zhi)針(zhen)可以加上或減去一(yi)個(ge)整數(shu)。指(zhi)針(zhen)的(de)這種運算的(de)意義和(he)通常的(de)數(shu)值(zhi)的(de)加減運算的(de)意義是不一(yi)樣(yang)的(de)。例如(ru):

例二:
        #include < stdio.h>
        int main()
        {
                int *p,i;
                char *q;
                int a[20] = {1,2,4,2,5};
                char b[20] = {'a','b','c','d','s','h'};
                p = a;
                q = b;
                printf("%d\n",sizeof(char *));
                for( i = 0; i < 5;i++ )
                {
                        printf("%d\n",*(p++));
                }
                for( i = 0; i < 2; i++ )
                {
                        printf("%c\n",*(q++));
                }
                for( i = 0; i < 2; i++)
                {
                        printf("%p\n",q++);
                }
                        return 0;
        }

在上例(li)中,指(zhi)(zhi)(zhi)(zhi)針(zhen)p的(de)(de)(de)(de)類(lei)型(xing)是(shi)(shi)(shi)(shi)(shi)int*,它(ta)指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)的(de)(de)(de)(de)類(lei)型(xing)是(shi)(shi)(shi)(shi)(shi)int,它(ta)被初始化為(wei)指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)整(zheng)形數(shu)(shu)組(zu)(zu)(zu)(zu)a。接下來指(zhi)(zhi)(zhi)(zhi)針(zhen)p被加(jia)(jia)了(le)(le)(le)1,編譯器是(shi)(shi)(shi)(shi)(shi)這(zhe)樣(yang)處理(li) 的(de)(de)(de)(de):它(ta)把指(zhi)(zhi)(zhi)(zhi)針(zhen)p的(de)(de)(de)(de)值加(jia)(jia)上了(le)(le)(le)sizeof(int),在32位程(cheng)序(xu)中,是(shi)(shi)(shi)(shi)(shi)被加(jia)(jia)上了(le)(le)(le)4。由(you)(you)于地(di)(di)址(zhi)(zhi)是(shi)(shi)(shi)(shi)(shi)用字(zi)節(jie)做 單(dan)位的(de)(de)(de)(de),故p所指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)的(de)(de)(de)(de)地(di)(di)址(zhi)(zhi)由(you)(you)原來的(de)(de)(de)(de)變量a的(de)(de)(de)(de)地(di)(di)址(zhi)(zhi)向(xiang)(xiang)高(gao)地(di)(di)址(zhi)(zhi)方(fang)向(xiang)(xiang)增(zeng)(zeng)加(jia)(jia)了(le)(le)(le)4個字(zi)節(jie)。由(you)(you)于int類(lei)型(xing)的(de)(de)(de)(de)長度(du)是(shi)(shi)(shi)(shi)(shi)四個字(zi)節(jie),所以,原來p是(shi)(shi)(shi)(shi)(shi)指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)數(shu)(shu)組(zu)(zu)(zu)(zu)a的(de)(de)(de)(de)第0 號單(dan)元開始的(de)(de)(de)(de)四個字(zi)節(jie),此時(shi)指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)了(le)(le)(le)數(shu)(shu)組(zu)(zu)(zu)(zu)a中從第一(yi)(yi)個元素(su)。同理(li),指(zhi)(zhi)(zhi)(zhi)針(zhen)q加(jia)(jia)1,q所指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)的(de)(de)(de)(de)地(di)(di)址(zhi)(zhi)向(xiang)(xiang)高(gao)地(di)(di)址(zhi)(zhi)增(zeng)(zeng)加(jia)(jia)了(le)(le)(le)1個字(zi)節(jie),數(shu)(shu)組(zu)(zu)(zu)(zu)b的(de)(de)(de)(de)每一(yi)(yi)個元素(su)是(shi)(shi)(shi)(shi)(shi)char類(lei)型(xing)的(de)(de)(de)(de),占1個字(zi)節(jie),所以此時(shi)指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)了(le)(le)(le)數(shu)(shu)組(zu)(zu)(zu)(zu)的(de)(de)(de)(de)下一(yi)(yi)個元素(su)。第三個for循環,實際上就是(shi)(shi)(shi)(shi)(shi)q所指(zhi)(zhi)(zhi)(zhi)向(xiang)(xiang)的(de)(de)(de)(de)地(di)(di)址(zhi)(zhi)加(jia)(jia)上sizeof(char),輸出的(de)(de)(de)(de)是(shi)(shi)(shi)(shi)(shi)數(shu)(shu)組(zu)(zu)(zu)(zu)b首地(di)(di)址(zhi)(zhi)加(jia)(jia)1."printf("%d\n",sizeof(char *));"輸出的(de)(de)(de)(de)是(shi)(shi)(shi)(shi)(shi)指(zhi)(zhi)(zhi)(zhi)針(zhen)本(ben)身所占的(de)(de)(de)(de)大小,指(zhi)(zhi)(zhi)(zhi)針(zhen)本(ben)身占據了(le)(le)(le)4個字(zi)節(jie)的(de)(de)(de)(de)長度(du)。

發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)