首頁技術(shù)文章正文

c語言二級(jí)指針的理解【黑馬程序員】

更新時(shí)間:2020-09-18 來源:傳智播客 瀏覽量:


之前幾篇文章介紹的指針都是一級(jí)指針,其實(shí)指針還可以指向一個(gè)指針,即指針中存儲(chǔ)的是另一個(gè)指針變量的地址,這樣的指針稱為二級(jí)指針,使用二級(jí)指針可以間接修改一級(jí)指針的指向,也可以修改一級(jí)指針指向的變量的值。

定義二級(jí)指針的格式如下:

變量類型 **變量名;

上述語法格式中,變量類型就是該指針變量指向的指針變量所指變量的數(shù)據(jù)類型,兩個(gè)符號(hào)“*”,表明這個(gè)變量是個(gè)二級(jí)指針變量。

通過二級(jí)指針可以直接修改一級(jí)指針指向的變量的值,也可以間接修改一級(jí)指針的指向。下面以案例的形式介紹二級(jí)指針這兩方面的作用。

1、通過二級(jí)指針間接修改變量的值

下面通過一個(gè)案例來演示如何使用二級(jí)指針直接修改變量的值,如例1所示。

例1 addr.c

#include <stdio.h>
int main()
{
  int a = 1;         //整型變量
  int* p = &a;        //一級(jí)指針p,指向整型變量a
  int** q = &p;       //二級(jí)指針q,指向一級(jí)指針p
  printf("變量a的地址:%p\n",&a);
  printf("一級(jí)指針p的地址:%p\n", p);
  printf("二級(jí)指針q存儲(chǔ)的值:%p\n", *q);
  printf("二級(jí)指針q的地址:%p\n", q);
  **q = 2;          //二級(jí)指針間接改變,
  printf("變量a的值%d\n", a);
  return 0;
}

例1運(yùn)行結(jié)果如圖1所示。

1600418910350_二級(jí)指針.jpg

在例1中,指針q是一個(gè)二級(jí)指針,其中存儲(chǔ)一級(jí)指針p的地址,而p中存儲(chǔ)整型變量a的地址,第11行代碼通過間接訪問運(yùn)算符“”間接修改二級(jí)指針變量q中存儲(chǔ)的指針?biāo)赶虻闹?,從而修改變量a的值。由圖5-10可知,變量a的值被修改成功。它們之間的邏輯關(guān)系如圖2所示。

1600418924586_指向指針變量.jpg

從圖2運(yùn)行結(jié)果可以清晰的發(fā)現(xiàn)變量a的地址、一級(jí)指針p的地址和二級(jí)指針存儲(chǔ)的地址值是一樣的。

2、通過二級(jí)指針改變一級(jí)指針的指向

二級(jí)指針除了直接改變變量的值以外,也可以改變一級(jí)指針的指向,下面通過一個(gè)案例來演示如何通過二級(jí)指針改變一級(jí)指針的指向,如例2所示。

例2 poniter.c

#include <stdio.h>
int main()
{
  int a = 1;         //整型變量
  int* p = &a;        //一級(jí)指針p,指向整型變量a
  int** q = &p;       //二級(jí)指針q,指向一級(jí)指針p
  int b = 3;
  printf("變量a的地址:%p\n", &a);
  printf("一級(jí)指針p的地址:%p\n", p);
  printf("二級(jí)指針q存儲(chǔ)的值:%p\n", *q);
  printf("二級(jí)指針q的地址:%p\n", q);
  printf("================================\n");
  *q = &b;          //修改一級(jí)指針的指向
  printf("變量a的地址:%p\n", &a);
  printf("變量b的地址:%p\n", &b);
  printf("一級(jí)指針p的地址:%p\n", p);
  printf("二級(jí)指針q存儲(chǔ)的值:%p\n", *q);
  printf("二級(jí)指針q的地址:%p\n", q);
  printf("指針p指向地址存儲(chǔ)的值%d\n", *p);
  return 0;
}

例2運(yùn)行結(jié)果如圖2所示。


1600418842534_二級(jí)指針運(yùn)行結(jié)果.jpg

在例2中,第4~5行代碼定義int類型變量a,取其地址賦值給一級(jí)指針變量p;第6行代碼取一級(jí)指針變量p的地址賦值給二級(jí)指針q,則二級(jí)指針q的值是一級(jí)指針變量p的內(nèi)存地址;第8~11行代碼分別輸出變量a的地址、一級(jí)指針p的地址、二級(jí)指針q存儲(chǔ)的值以及二級(jí)指針q的地址。由圖2可知,二級(jí)指針q存儲(chǔ)的值與一級(jí)指針p的地址以及變量a的地址是相同的。

在例2中,通過間接訪問運(yùn)算符“”,修改二級(jí)指針的指向,即第13行代碼使二級(jí)指針變量q中保存的一級(jí)指針變量p指向變量b。它們之間的邏輯關(guān)系如圖3所示。

1600418882679_二級(jí)指針改變指向關(guān)系.jpg

第14~19行代碼分別輸出變量a的地址、變量b的地址、一級(jí)指針變量p的地址、二級(jí)指針q存儲(chǔ)的值及其地址。從圖3的輸出結(jié)果可以清晰的看到一級(jí)指針變量p、二級(jí)指針變量q存儲(chǔ)的值和變量b的地址是相同的。


猜你喜歡:

C語言指針變量類型和大小

c語言指針詳解:什么是指針?

C語言取地址運(yùn)算

C語言指針間接訪問

C語言培訓(xùn)課程


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!