C語(yǔ)言一級(jí)指針二級(jí)指針和三級(jí)指針區(qū)別及使用詳解

1.一級(jí)指針
#include?<stdio.h>
int?main(){
?int?data?=?10;
?int?*p1?=?&data;?//?p1?=?&data
?printf("data的地址是:%p\n",?&data);
?printf("p1指針變量地址是:%d,內(nèi)容是%d\n",?p1,?*p1);
?//?通過(guò)指針修改變量值
?printf("\n");
?*p1?=?20;
?printf("data=%d,?*p1=%d\n",?data,?*p1);
?return?0;
}運(yùn)行結(jié)果如下:
data的地址是:00AFFB18
p保存的data的地址是:11533080,內(nèi)容是10
data=20, *p1=20
一級(jí)指針的用法其實(shí)是取數(shù)據(jù)的地址,以此類(lèi)推,二級(jí)指針就是取一級(jí)指針的地址,也可以表示一級(jí)指針的指向的內(nèi)容。
2.二級(jí)指針
指針變量也是一種變量,也會(huì)占用存儲(chǔ)空間,也可以使用&獲取它的地址。C語(yǔ)言不限制指針的級(jí)數(shù),每增加一級(jí)指針,在定義指針變量時(shí)就得增加一個(gè)星號(hào)*。p1是一級(jí)指針,指向普通類(lèi)型的數(shù)據(jù),定義時(shí)只有一個(gè)*;p2是二級(jí)指針,指向一級(jí)指針p1,定義時(shí)需要兩個(gè)*。
它們關(guān)系如下所示:

上圖關(guān)系所示:data是int類(lèi)型變量,p1是指向data的指針變量,p2又是指向p1的指針變量。
假設(shè)a、p1、p2、p3的地址分別為0x00A0、0x0010、0x0020、0x0030。它們之間的關(guān)系可以用下圖描述:

根據(jù)上圖描述的邏輯,代碼表示如下:
#include?<stdio.h>
int?main(){
?int?data?=?10;
?int?*p1?=?&data;
?int?**p2?=?&p1;
?printf("%d,?%d,?%d\n",?data,?*p1,?**p2);
?printf("&p1=%#X,?p2=%#X\n",?&p1,?p2);?//?p1的地址為p2的值
?printf("&data=%#X,?p1=%#X\n",?&data,?p1);?//?data的地址為p1的值
?return?0;
}運(yùn)行結(jié)果如下所示:
10, 10, 10
&p1=0X12FFE94, p2=0X12FFE94
&data=0X12FFEA0, p1=0X12FFEA0
**p2等價(jià)于(*(*p2)),
3.三級(jí)指針
以此類(lèi)推,一級(jí)指針加一個(gè)*,二級(jí)指針增加兩個(gè)*,三級(jí)指針增加三個(gè)*。
我們可以先用圖去梳理指針之間的關(guān)系:

假設(shè)a、p1、p2、p3的地址分別為0x00A0、0x0010、0x0020、0x0030。它們之間的關(guān)系可以用下圖描述:

根據(jù)上圖描述的邏輯,代碼表示如下:
#include?<stdio.h>
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;
}100, 100, 100, 100
&p2 = 0XC2FB7C, p3 = 0XC2FB7C
&p1 = 0XC2FB88, p2 = 0XC2FB88, *p3 = 0XC2FB88
&a = 0XC2FB94, p1 = 0XC2FB94, *p2 = 0XC2FB94, **p3 = 0XC2FB94
以三級(jí)指針 p3 為例來(lái)分析上面的代碼。***p3等價(jià)于*(*(*p3))。*p3 得到的是 p2 的值,也即 p1 的地址;*(*p3) 得到的是 p1 的值,也即 a 的地址;經(jīng)過(guò)三次操作后,*(*(*p3)) 得到的是 a 的值。
以上就是C語(yǔ)言一級(jí)指針二級(jí)指針和三級(jí)指針區(qū)別及使用詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言一級(jí)二級(jí)三級(jí)指針的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言根據(jù)協(xié)議分割獲取字符串單元的實(shí)現(xiàn)代碼
今天小編就為大家分享一篇關(guān)于C語(yǔ)言根據(jù)協(xié)議分割獲取字符串單元的實(shí)現(xiàn)代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
C語(yǔ)言實(shí)現(xiàn)Fibonacci數(shù)列遞歸
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)Fibonacci數(shù)列遞歸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
win10環(huán)境下vscode Linux C++開(kāi)發(fā)代碼自動(dòng)提示配置(基于WSL)
這篇文章主要介紹了win10環(huán)境下vscode Linux C++開(kāi)發(fā)代碼自動(dòng)提示配置(基于WSL),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Qt GUI圖形圖像開(kāi)發(fā)之QT表格控件QTableView詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了Qt GUI圖形圖像開(kāi)發(fā)之QT表格控件QTableView詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03
C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
一起來(lái)看看C語(yǔ)言線(xiàn)性表的線(xiàn)性鏈表
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言線(xiàn)性表的線(xiàn)性鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
基于C語(yǔ)言模擬實(shí)現(xiàn)人生重開(kāi)模擬器游戲
人生重開(kāi)模擬器是前段時(shí)間非?;鸬囊粋€(gè)小游戲,所以本文我們將一起學(xué)習(xí)使用c語(yǔ)言寫(xiě)一個(gè)簡(jiǎn)易版的人生重開(kāi)模擬器,感興趣的小伙伴可以了解下2024-02-02
最新VScode C/C++ 環(huán)境配置的詳細(xì)教程
這篇文章主要介紹了最新VScode C/C++ 環(huán)境配置的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11

