C語(yǔ)言指針教程示例詳解
指針
指針提供了對(duì)地址操作的一種方法,因此,使用指針可使得 C 語(yǔ)言能夠更高效地實(shí)現(xiàn)對(duì)計(jì)算機(jī)底層硬件的操作。另外,通過(guò)指針可以更便捷地操作數(shù)組。在一定意義上可以說(shuō),指針是 C 語(yǔ)言的精髓。
概念解釋就不去搬原定義了,又臭又長(zhǎng)不好理解,精煉兩點(diǎn)就是:
1.指針是內(nèi)存中的一個(gè)最小單元的編號(hào),也就是地址;
2.平時(shí)我們說(shuō)的指針,通常是指指針變量,用來(lái)存儲(chǔ)內(nèi)存地址的變量
也就是說(shuō):指針就是地址,口語(yǔ)中指針通常是指針變量
內(nèi)存
要搞明白指針首先要搞明白內(nèi)存。
我們把一大坨內(nèi)存劃分為一個(gè)個(gè)小的內(nèi)存單元,一個(gè)基本單元大小為一個(gè)字節(jié),我們對(duì)應(yīng)需要某個(gè)單元里面的數(shù)據(jù)時(shí),就要進(jìn)行查找,大海撈針的工程如果逐個(gè)排查就顯得低效而呆滯,于是我們就對(duì)其編號(hào),如同對(duì)一個(gè)大酒店的房間設(shè)置門(mén)牌號(hào)一樣。我們說(shuō)的內(nèi)存編號(hào)就相當(dāng)于內(nèi)存地址

這個(gè)編號(hào)是怎么產(chǎn)生的呢?我們的機(jī)子有32位和64位,對(duì)應(yīng)有32根地址線和64根地址線,地址線其實(shí)就是電線,通電后高低電頻轉(zhuǎn)化為數(shù)字信號(hào)對(duì)標(biāo)的就是 1 和 0 。強(qiáng)調(diào)一點(diǎn),這些編號(hào)是不需要存起來(lái)的。
我們實(shí)際看一下數(shù)據(jù)在內(nèi)存中的布局,通過(guò)調(diào)試的內(nèi)存窗口可以進(jìn)行監(jiān)視,

為了直觀看到我直接在地址欄輸入 &a 查看當(dāng)前內(nèi)容:

發(fā)現(xiàn)確實(shí)如此。
指針類(lèi)型
int* pa = &a; char* pb = &a;
意義:
我們把 int* 放到char里面可行嗎?理論上是可以的,因?yàn)橹羔槾笮《际撬膫€(gè)字節(jié),但是放到char里面解引用只訪問(wèn)了一個(gè),總結(jié)一下,指針類(lèi)型賦予了指針的訪問(wèn)權(quán)限大小。
野指針
形如:
int main()
{
int *p;
*p = 20;
return 0;
}
野指針就像是野狗,這條野狗它沒(méi)有主人,因此它很危險(xiǎn)見(jiàn)誰(shuí)咬誰(shuí);同理,指針沒(méi)有初始化時(shí),它沒(méi)有指向任何對(duì)象,就不敢動(dòng)他,p的地址是隨機(jī)值,分配的空間也是不知道的。
野指針成因除了未初始化還有就是越界訪問(wèn)或者指針指向空間已經(jīng)釋放。所以一定要初始化,有值就指向這個(gè)值,沒(méi)有就直接NULL或者分配一塊合理的空間以保證有效性(如下)。當(dāng)你有一個(gè)指針創(chuàng)建了不想用時(shí),記得一定把這條野狗栓在樹(shù)上!
int* p = NULL; int* q = (int*)malloc(1024);
指針運(yùn)算
指針之間其實(shí)是可以進(jìn)行計(jì)算的,比如指針 - 指針,如下:
int main()
{
int a[5]={0};
prinf("%d\n",&a[4]-&a[0]);
prinft("%d\n",&a[0]-&a[4]);
return 0;
}
結(jié)果是4,-4。所以不難知道兩個(gè)地址相減就是元素的個(gè)數(shù),這個(gè)表達(dá)式的前提是兩個(gè)指針指向同一塊空間。
有一些特殊情況需要給大家聲明一下:
for (int *p = &arr[NUM - 1]; p >= arr; p--)
{
printf("%d ",*p);
}
當(dāng)數(shù)組–這種結(jié)構(gòu)存在時(shí),雖然很多編譯器可以順利完成,但還是應(yīng)該避免這樣寫(xiě),因?yàn)闃?biāo)準(zhǔn)并不保證它可行,規(guī)定是:
C語(yǔ)言標(biāo)準(zhǔn)規(guī)定了允許指向數(shù)組元素的指針可以和最后一個(gè)元素后面的內(nèi)存位置進(jìn)行指針比較,不允許與第一個(gè)元素之前的內(nèi)存位置進(jìn)行比較
二級(jí)指針
看上去是不是感覺(jué)很高大上?不要想的太神秘也不用過(guò)分聯(lián)想。
我們?cè)趯?xiě)指針時(shí)“ * ”不管是靠近類(lèi)型還是變量意義都是一樣的,于是就有下面操作:
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
return 0;
}
這里 a取地址存入p,假設(shè) p 是 0x0022FF40,在32位平臺(tái)下 p 有沒(méi)有地址呢?當(dāng)然有,指針大小為 4 個(gè)字節(jié)嘛,必定會(huì)在內(nèi)存中開(kāi)辟一塊地方,那么我取 p 的地址時(shí)就是所謂的二級(jí)指針。
歐吼吼~~,對(duì),快樂(lè)就是無(wú)限套娃,同理得三級(jí),四級(jí)……

指針數(shù)組
我們有整型數(shù)組形如:int arr[10] ;存放整型的數(shù)組
同理如:int* arr[10] = { &a,&b,&c…… } ,就是用來(lái)存放整型指針的數(shù)組。
以上就是C語(yǔ)言指針教程示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言指針教程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言中的while循環(huán)語(yǔ)句示例詳解
這篇文章主要介紹了C語(yǔ)言中的while循環(huán)語(yǔ)句,主要包括while循環(huán)的基本信息及常見(jiàn)問(wèn)題,本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06
C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序
這篇文章主要介紹了C語(yǔ)言中使用qsort函數(shù)對(duì)自定義結(jié)構(gòu)體數(shù)組進(jìn)行排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
深入探討POJ 2312 Battle City 優(yōu)先隊(duì)列+BFS
本篇文章是對(duì)優(yōu)先隊(duì)列+BFS進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)簡(jiǎn)單介紹
這篇文章主要為大家詳細(xì)介紹了C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)的實(shí)現(xiàn)方法,如何使用C/C++產(chǎn)生隨機(jī)數(shù)函數(shù),感興趣的小伙伴們可以參考一下2016-04-04
詳解C++值多態(tài)中的傳統(tǒng)多態(tài)與類(lèi)型擦除
值多態(tài)是一種介于傳統(tǒng)多態(tài)與類(lèi)型擦除之間的多態(tài)實(shí)現(xiàn)方式,借鑒了值語(yǔ)義,保留了繼承,在單繼承的適用范圍內(nèi),程序和程序員都能從中受益。這篇文章主要介紹了C++值多態(tài)中的傳統(tǒng)多態(tài)與類(lèi)型擦除,需要的朋友可以參考下2020-04-04
QT樹(shù)的具體項(xiàng)目實(shí)現(xiàn)
本文主要介紹了QT樹(shù)的具體項(xiàng)目實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
VScode+ESP32簡(jiǎn)單環(huán)境搭建
本文章向大家介紹ESP32-C3搭建環(huán)境教程,主要包括ESP32-C3搭建環(huán)境教程使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

