摘要:另外,通過指針可以更便捷地操作數(shù)組。在一定意義上可以說,指針是語言的精髓。野指針成因除了未初始化還有就是越界訪問或者指針指向空間已經(jīng)釋放。所以不難知道兩個(gè)地址相減就是元素的個(gè)數(shù),這個(gè)表達(dá)式的前提是兩個(gè)指針指向同一塊空間。
小編是大一菜鳥不贅述,歡迎大佬指點(diǎn)江山(QQ:1319365055)
此前博客點(diǎn)我!點(diǎn)我!請搜索博主 【知曉天空之藍(lán)】點(diǎn)我!點(diǎn)我!請搜索博主 【知曉天空之藍(lán)】或掃碼進(jìn)入!
喬喬的gitee代碼庫(打灰人 )歡迎訪問,點(diǎn)我!
(https://blog.51cto.com)感謝支持!
現(xiàn)在是北京時(shí)間11:30,周三nb,單周沒有課,算是在彌補(bǔ)周六了吧。夜貓子屬實(shí)走不出晚起陰影,早8人干完飯回來搗鼓到這個(gè)點(diǎn)捏,差不多得了,習(xí)慣就好,習(xí)慣就好??
指針提供了對(duì)地址操作的一種方法,因此,使用指針可使得 C 語言能夠更高效地實(shí)現(xiàn)對(duì)計(jì)算機(jī)底層硬件的操作。另外,通過指針可以更便捷地操作數(shù)組。在一定意義上可以說,指針是 C 語言的精髓。
概念解釋就不去搬原定義了,又臭又長不好理解,精煉兩點(diǎn)就是:
1.指針是內(nèi)存中的一個(gè)最小單元的編號(hào),也就是地址;
2.平時(shí)我們說的指針,通常是指指針變量,用來存儲(chǔ)內(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è)置門牌號(hào)一樣。我們說的內(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)是不需要存起來的。
我們實(shí)際看一下數(shù)據(jù)在內(nèi)存中的布局,通過調(diào)試的內(nèi)存窗口可以進(jìn)行監(jiān)視,
為了直觀看到我直接在地址欄輸入 &a 查看當(dāng)前內(nèi)容:
發(fā)現(xiàn)確實(shí)如此。
int* pa = &a;char* pb = &a;
意義:
我們把 int* 放到char里面可行嗎?理論上是可以的,因?yàn)橹羔槾笮《际撬膫€(gè)字節(jié),但是放到char里面解引用只訪問了一個(gè),總結(jié)一下,指針類型賦予了指針的訪問權(quán)限大小。
形如:
int main(){int *p;*p = 20;return 0;}
野指針就像是野狗,這條野狗它沒有主人,因此它很危險(xiǎn)見誰咬誰;同理,指針沒有初始化時(shí),它沒有指向任何對(duì)象,就不敢動(dòng)他,p的地址是隨機(jī)值,分配的空間也是不知道的。
野指針成因除了未初始化還有就是越界訪問或者指針指向空間已經(jīng)釋放。所以一定要初始化,有值就指向這個(gè)值,沒有就直接NULL或者分配一塊合理的空間以保證有效性(如下)。當(dāng)你有一個(gè)指針創(chuàng)建了不想用時(shí),記得一定把這條野狗栓在樹上!
int* p = NULL; int* q = (int*)malloc(1024);
指針之間其實(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)該避免這樣寫,因?yàn)闃?biāo)準(zhǔn)并不保證它可行,規(guī)定是:
C語言標(biāo)準(zhǔn)規(guī)定了允許指向數(shù)組元素的指針可以和最后一個(gè)元素后面的內(nèi)存位置進(jìn)行指針比較,不允許與第一個(gè)元素之前的內(nèi)存位置進(jìn)行比較
看上去是不是感覺很高大上?不要想的太神秘也不用過分聯(lián)想。
我們在寫指針時(shí)“ * ”不管是靠近類型還是變量意義都是一樣的,于是就有下面操作:
int main(){int a = 10;int* p = &a;int** pp = &p;return 0; }
這里 a取地址存入p,假設(shè) p 是 0x0022FF40,在32位平臺(tái)下 p 有沒有地址呢?當(dāng)然有,指針大小為 4 個(gè)字節(jié)嘛,必定會(huì)在內(nèi)存中開辟一塊地方,那么我取 p 的地址時(shí)就是所謂的二級(jí)指針。
歐吼吼~~,對(duì),快樂就是無限套娃,同理得三級(jí),四級(jí)……
我們有整型數(shù)組形如:int arr[10] ;存放整型的數(shù)組,同理如:int* arr[10] = { &a,&b,&c…… } ,就是用來存放整型指針的數(shù)組。
今天就到這里吧,摸了家人們。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/123730.html
摘要:來我們一起感受下的風(fēng)騷式的代碼風(fēng)格。魔鬼式變量聲明數(shù)組的聲明就是數(shù)組,它的定義方式如下在中,表示數(shù)組的長度,表示存儲(chǔ)元素的類型。在開發(fā)中不定長度表示的數(shù)組全部都是。它有點(diǎn)類似于語言的類型。和命名將的和方法命名方案做了進(jìn)一步發(fā)展。 最近想搞搞后臺(tái)開發(fā),話說注意力就轉(zhuǎn)移到了公司用的golang。用Go做微服務(wù)比較方便,或許是因?yàn)間olang強(qiáng)悍的語法吧,看到go的語法,自己已被深深的吸引。...
摘要:來我們一起感受下的風(fēng)騷式的代碼風(fēng)格。魔鬼式變量聲明數(shù)組的聲明就是數(shù)組,它的定義方式如下在中,表示數(shù)組的長度,表示存儲(chǔ)元素的類型。在開發(fā)中不定長度表示的數(shù)組全部都是。它有點(diǎn)類似于語言的類型。和命名將的和方法命名方案做了進(jìn)一步發(fā)展。 最近想搞搞后臺(tái)開發(fā),話說注意力就轉(zhuǎn)移到了公司用的golang。用Go做微服務(wù)比較方便,或許是因?yàn)間olang強(qiáng)悍的語法吧,看到go的語法,自己已被深深的吸引。...
摘要:指針變量可以存放基本類型數(shù)據(jù)的地址,也可以存放數(shù)組函數(shù)以及其他指針變量的地址。數(shù)組名表示的是整個(gè)數(shù)組所占的字節(jié)數(shù)。在這里數(shù)組指針的類型是。這也是我們可以用數(shù)組指針來接收二維數(shù)組數(shù)組名的原因。 目錄 零.前言 一.指針的定義 二.指針類型的意義 1.指針類型決定了指針解引用時(shí)一次訪問幾個(gè)字...
摘要:這里分塊講解六函數(shù)棧幀的銷毀過程一解析的作用是將棧頂?shù)臄?shù)據(jù)彈出,彈出數(shù)據(jù)儲(chǔ)存到相應(yīng)寄存器中。 ?前言? 讀完這篇博客,你可以明白什么? ①局部變量到底是怎么在棧上創(chuàng)建的? ②為什么局部變量不初始化為隨機(jī)值? ③函數(shù)是怎么傳參的?傳參的先后順序是什么? ④形參和實(shí)參是什么關(guān)系? ⑤函數(shù)調(diào)用是怎...
閱讀 4001·2021-11-24 09:38
閱讀 1465·2021-11-19 09:40
閱讀 2799·2021-11-18 10:02
閱讀 3736·2021-11-09 09:46
閱讀 1806·2021-09-22 15:27
閱讀 3139·2019-08-29 15:24
閱讀 1027·2019-08-29 12:40
閱讀 1708·2019-08-28 18:24