更新時(shí)間:2020-09-18 來源:傳智播客 瀏覽量:
之前幾篇文章介紹的指針都是一級指針,其實(shí)指針還可以指向一個(gè)指針,即指針中存儲(chǔ)的是另一個(gè)指針變量的地址,這樣的指針稱為二級指針,使用二級指針可以間接修改一級指針的指向,也可以修改一級指針指向的變量的值。
定義二級指針的格式如下:
變量類型 **變量名;
上述語法格式中,變量類型就是該指針變量指向的指針變量所指變量的數(shù)據(jù)類型,兩個(gè)符號“*”,表明這個(gè)變量是個(gè)二級指針變量。
通過二級指針可以直接修改一級指針指向的變量的值,也可以間接修改一級指針的指向。下面以案例的形式介紹二級指針這兩方面的作用。
1、通過二級指針間接修改變量的值
下面通過一個(gè)案例來演示如何使用二級指針直接修改變量的值,如例1所示。
例1 addr.c
#include <stdio.h> int main() { int a = 1; //整型變量 int* p = &a; //一級指針p,指向整型變量a int** q = &p; //二級指針q,指向一級指針p printf("變量a的地址:%p\n",&a); printf("一級指針p的地址:%p\n", p); printf("二級指針q存儲(chǔ)的值:%p\n", *q); printf("二級指針q的地址:%p\n", q); **q = 2; //二級指針間接改變, printf("變量a的值%d\n", a); return 0; }
例1運(yùn)行結(jié)果如圖1所示。
在例1中,指針q是一個(gè)二級指針,其中存儲(chǔ)一級指針p的地址,而p中存儲(chǔ)整型變量a的地址,第11行代碼通過間接訪問運(yùn)算符“”間接修改二級指針變量q中存儲(chǔ)的指針?biāo)赶虻闹担瑥亩薷淖兞縜的值。由圖5-10可知,變量a的值被修改成功。它們之間的邏輯關(guān)系如圖2所示。
從圖2運(yùn)行結(jié)果可以清晰的發(fā)現(xiàn)變量a的地址、一級指針p的地址和二級指針存儲(chǔ)的地址值是一樣的。
2、通過二級指針改變一級指針的指向
二級指針除了直接改變變量的值以外,也可以改變一級指針的指向,下面通過一個(gè)案例來演示如何通過二級指針改變一級指針的指向,如例2所示。
例2 poniter.c
#include <stdio.h> int main() { int a = 1; //整型變量 int* p = &a; //一級指針p,指向整型變量a int** q = &p; //二級指針q,指向一級指針p int b = 3; printf("變量a的地址:%p\n", &a); printf("一級指針p的地址:%p\n", p); printf("二級指針q存儲(chǔ)的值:%p\n", *q); printf("二級指針q的地址:%p\n", q); printf("================================\n"); *q = &b; //修改一級指針的指向 printf("變量a的地址:%p\n", &a); printf("變量b的地址:%p\n", &b); printf("一級指針p的地址:%p\n", p); printf("二級指針q存儲(chǔ)的值:%p\n", *q); printf("二級指針q的地址:%p\n", q); printf("指針p指向地址存儲(chǔ)的值%d\n", *p); return 0; }
例2運(yùn)行結(jié)果如圖2所示。
在例2中,第4~5行代碼定義int類型變量a,取其地址賦值給一級指針變量p;第6行代碼取一級指針變量p的地址賦值給二級指針q,則二級指針q的值是一級指針變量p的內(nèi)存地址;第8~11行代碼分別輸出變量a的地址、一級指針p的地址、二級指針q存儲(chǔ)的值以及二級指針q的地址。由圖2可知,二級指針q存儲(chǔ)的值與一級指針p的地址以及變量a的地址是相同的。
在例2中,通過間接訪問運(yùn)算符“”,修改二級指針的指向,即第13行代碼使二級指針變量q中保存的一級指針變量p指向變量b。它們之間的邏輯關(guān)系如圖3所示。
第14~19行代碼分別輸出變量a的地址、變量b的地址、一級指針變量p的地址、二級指針q存儲(chǔ)的值及其地址。從圖3的輸出結(jié)果可以清晰的看到一級指針變量p、二級指針變量q存儲(chǔ)的值和變量b的地址是相同的。
猜你喜歡: