1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        二級(jí)指針、一維數(shù)組與指針,二維數(shù)組與指針

        共 1330字,需瀏覽 3分鐘

         ·

        2022-02-25 13:53

        二級(jí)指針

        指針可以指向一個(gè)普通類型的數(shù)據(jù),例如 int、double、char 等,也可以指向一個(gè)指針類型的數(shù)據(jù),例如 int *、double *、char * 等。

        如果一個(gè)指針指向的是另外一個(gè)指針,我們就稱它為二級(jí)指針,或者指向指針的指針。

        假設(shè)有一個(gè) int 類型的變量 age,page是指向 age 的指針變量,ppage 又是指向 page 的指針變量,它們的關(guān)系如下圖所示:

        將這種關(guān)系轉(zhuǎn)換為C語(yǔ)言代碼:

        int age =28;int *page = &age;int **ppage = &page;

        指針變量也是一種變量,也會(huì)占用存儲(chǔ)空間,也可以使用&獲取它的地址。C語(yǔ)言不限制指針的級(jí)數(shù),每增加一級(jí)指針,在定義指針變量時(shí)就得增加一個(gè)星號(hào)*。page 是一級(jí)指針,指向普通類型的數(shù)據(jù),定義時(shí)有一個(gè)*;ppage 是二級(jí)指針,指向一級(jí)指針 page,定義時(shí)有兩個(gè)*。

        如果我們希望再定義一個(gè)三級(jí)指針 p3age,讓它指向 ppage,那么可以這樣寫:

        int ***p3age = &ppage;

        四級(jí)指針也是類似的道理:

        int ****p4age = &p3age;

        實(shí)際開發(fā)中會(huì)經(jīng)常使用一級(jí)指針和二級(jí)指針,幾乎用不到高級(jí)指針。

        想要獲取指針指向的數(shù)據(jù)時(shí),一級(jí)指針加一個(gè)*,二級(jí)指針加兩個(gè)*,三級(jí)指針加三個(gè)*,以此類推,請(qǐng)看代碼:

        #include int main(){   int a =100;   int *p1 = &a;   int **p2 = &p1;   int ***p3 = &p2;   printf("%d, %d, %d, %d\n", a, *p1, **p2, ***p3);   printf("&p2 = %#X, p3 = %#X\n", &p2, p3);   printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n", &p1, p2, *p3);   printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n", &a, p1, *p2, **p3);   return 0;}

        一維數(shù)組指針

        數(shù)組(Array)是一系列具有相同類型的數(shù)據(jù)的集合,每一份數(shù)據(jù)叫做一個(gè)數(shù)組元素(Element)。數(shù)組中的所有元素在內(nèi)存中是連續(xù)排列的,整個(gè)數(shù)組占用的是一塊內(nèi)存。以int arr[] = { 99, 15, 100, 888, 252 };為例,該數(shù)組在內(nèi)存中的分布如下圖所示:

        定義數(shù)組時(shí),要給出數(shù)組名和數(shù)組長(zhǎng)度,數(shù)組名可以認(rèn)為是一個(gè)指針,它指向數(shù)組的第 0 個(gè)元素。在C語(yǔ)言中,我們將第 0 個(gè)元素的地址稱為數(shù)組的首地址。以上面的數(shù)組為例,下圖是 arr 的指向:

        數(shù)組下標(biāo)為啥從0開始?

        • 數(shù)組下標(biāo)實(shí)際上是每個(gè)元素的地址相對(duì)于第一個(gè)元素地址的偏移量

        訪問(wèn)數(shù)組元素除了可以通過(guò)下標(biāo)法之外,還可以通過(guò)指針?lè)?/em>訪問(wèn)。

        • 下標(biāo)法

          for(int i = 0;i < 6;i++)
          {
          ? ?printf("%d ",arr[i]);
          ? ?//printf("%d ",i[arr]);
          }
        • 指針?lè)?/span>

          for(int i = 0;i < 6;i++)
          {
          ? ?printf("%d ",*(arr + i));
          }

          這就是為什么在某些地方大家會(huì)看到 i[arr] 這種訪問(wèn)數(shù)組元素的方法的原因,實(shí)際上下標(biāo)法就是通過(guò)指針?lè)▉?lái)實(shí)現(xiàn)的,只不過(guò)編譯器幫助我們做了這個(gè)操作,簡(jiǎn)化了操作難度。

        指向數(shù)組的指針

        我們也可以定義一個(gè)指向數(shù)組的指針,例如:

        int arr[] = { 99, 15, 100, 888, 252 };
        int *p = arr;

        arr 本身可以看做是一個(gè)指針,可以直接賦值給指針變量 p。arr 是數(shù)組第 0 個(gè)元素的地址,所以int *p = arr;也可以寫作int *p = &arr[0];。也就是說(shuō),arr、p、&arr[0] 這三種寫法都是等價(jià)的,它們都指向數(shù)組第 0 個(gè)元素,或者說(shuō)指向數(shù)組的開頭。

        如果一個(gè)指針指向了數(shù)組,我們就稱它為數(shù)組指針(Array Pointer)

        數(shù)組指針指向的是數(shù)組中的一個(gè)具體元素,而不是整個(gè)數(shù)組,所以數(shù)組指針的類型和數(shù)組元素的類型有關(guān),上面的例子中,p 指向的數(shù)組元素是 int 類型,所以 p 的類型必須也是int *

        反過(guò)來(lái)想,p 并不知道它指向的是一個(gè)數(shù)組,p 只知道它指向的是一個(gè)整數(shù),究竟如何使用 p 取決于程序員的編碼。

        使用指針訪問(wèn)數(shù)組元素和使用函數(shù)名沒(méi)有任何區(qū)別,值得注意的是我們不同通過(guò)指針獲得數(shù)組的大小,但是通過(guò)數(shù)組名卻可以。

        printf("%d\n",sizeof(arr));     //數(shù)組所占字節(jié)數(shù) 20 Byte
        printf("%d\n",sizeof(p)); //指針?biāo)甲止?jié)數(shù) 4 Byte

        也就是說(shuō),根據(jù)數(shù)組指針不能逆推出整個(gè)數(shù)組元素的個(gè)數(shù),以及數(shù)組從哪里開始、到哪里結(jié)束等信息。不像字符串,數(shù)組本身也沒(méi)有特定的結(jié)束標(biāo)志,如果不知道數(shù)組的長(zhǎng)度,那么就無(wú)法遍歷整個(gè)數(shù)組。


        關(guān)于數(shù)組指針的謎題

        假設(shè) p 是指向數(shù)組 arr 中第 n 個(gè)元素的指針,那么 *p++、*++p、(*p)++ 分別是什么意思呢?

        *p++ 等價(jià)于 *(p++),表示先取得第 n 個(gè)元素的值,再將 p 指向下一個(gè)元素。

        *++p 等價(jià)于 *(++p),會(huì)先進(jìn)行 ++p 運(yùn)算,使得 p 的值增加,指向下一個(gè)元素,整體上相當(dāng)于 *(p+1),所以會(huì)獲得第 n+1 個(gè)數(shù)組元素的值。

        (*p)++ 就非常簡(jiǎn)單了,會(huì)先取得第 n 個(gè)元素的值,再對(duì)該元素的值加 1。假設(shè) p 指向第 0 ?個(gè)元素,并且第 0 個(gè)元素的值為 99,執(zhí)行完該語(yǔ)句后,第 0 ?個(gè)元素的值就會(huì)變?yōu)?100。


        數(shù)組名和數(shù)組指針的區(qū)別

        雖然說(shuō)數(shù)組名可以當(dāng)做指針使用,但實(shí)際上數(shù)組名并不等價(jià)于指針。

        • 數(shù)組名代表的是整個(gè)數(shù)組,具有確定數(shù)量的元素

        • 指針是一個(gè)標(biāo)量,不能確定指向的是否是一個(gè)數(shù)組

        • 數(shù)組可以在某些情況下會(huì)自動(dòng)轉(zhuǎn)換為指針,當(dāng)數(shù)組名在表達(dá)式中使用時(shí),編譯器會(huì)把數(shù)組名轉(zhuǎn)換為一個(gè)指針常量,是數(shù)組中的第一個(gè)元素的地址,類型就是數(shù)組元素的地址類型(通過(guò)sizeof也可以看出來(lái))


        二維數(shù)組指針

        二維數(shù)組可以理解為每一個(gè)元素都是一個(gè)一維數(shù)組的數(shù)組,這樣就可以很好的理解二維數(shù)組與指針了。

        下面定義了一個(gè)2行3列的二維數(shù)組,并畫出了對(duì)應(yīng)的內(nèi)存模型。

        我們可以使用arr[0]獲得第0個(gè)一維數(shù)組,然后再加上一個(gè)小標(biāo)就可以獲取到對(duì)應(yīng)的元素,如arr[0][0]獲取了第0行第0列的元素。

        瀏覽 57
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产日韩欧美激情 | 骚逼骚逼诱惑 | 成人做爰黄 片免费观看18 | 音影先锋资源男人网站 | 国产又粗又黄又长又爽动漫 | 欧美中文字幕一区二区三区老色批 | 成人激情在线视频 | 色五月.com | 久久精品99久久久久久久久 | 公妇借种乱h |