企業(yè)做英文網(wǎng)站什么關(guān)鍵詞可以搜到那種
目錄
什么是指針?
指針和指針類型
指針的類型
指針類型的意義
指針+-整數(shù)
指針的解引用
指針 - 指針
指針的關(guān)系運算
野指針
什么是野指針?
野指針的成因
如何規(guī)避野指針?
二級指針
什么是指針?
????????在介紹指針之前,我們需要先對內(nèi)存與地址有一個認識。
????????內(nèi)存:內(nèi)存是計算機重要且珍貴的硬件資源,計算機上所有的程序的都是運行在內(nèi)存中的。為了能夠合理有效的使用內(nèi)存,就把內(nèi)存劃分為一個個小的內(nèi)存單元。
????????那么這個內(nèi)存單元應(yīng)該多大呢?
????????如果內(nèi)存單元太小則不方便使用,太大則可能會浪費內(nèi)存資源,在經(jīng)過仔細的計算和權(quán)衡后設(shè)計者發(fā)現(xiàn)將一個字節(jié)作為內(nèi)存單元的大小是最合適的。
????????劃分好內(nèi)存后,如何有效的訪問到每個內(nèi)存單元呢?
????????在現(xiàn)實生活中定位居住地址時,相比起某某酒店第三層從左側(cè)數(shù)第七個房間這樣的表述形式,給每個房間一個唯一的號碼如307就可以更快速更準確的找到指定地址,同理,我們通過給內(nèi)存空間一個唯一的號碼來更有效的訪問內(nèi)存單元,這個行為就稱為編址(地址)。
? ? ? ? 那么應(yīng)該如何編址,以及每個地址對應(yīng)多大的空間?
????????眾所周知,計算機只能識別0,1這樣的二進制數(shù)。對于32位的計算機而言一共有32根地址線(物理電線),每根地址線可以產(chǎn)生兩種電信號:高電平和低電平。兩種電信號分別對應(yīng)二進制的0和1,32根地址線一共可以產(chǎn)生2^32種電信號,如下:
????????00000000 00000000 00000000 00000000
????????00000000 00000000 00000000 00000001
????????...
????????11111111 11111111 11111111 11111111經(jīng)過仔細的計算和權(quán)衡后我們發(fā)現(xiàn)一個字節(jié)(一個內(nèi)存單元)給一個號碼是比較合適的,這些號碼就被稱為內(nèi)存單元的地址。每一個地址可以維護一個內(nèi)存單元,2^32個地址就可以維護2^32個內(nèi)存單元(4GB),因此對于32位的機器而言,最大可以維護4GB的內(nèi)存空間,同理可得64位機器最大可以維護2^64個字節(jié)的內(nèi)存空間。
? ? ? ? 什么是指針?
????????指針是內(nèi)存中一個最小單元的編號,即指針實際上就是地址。而我們平時口語中所說的指針,通常指的是指針變量,是用來存放內(nèi)存地址的變量。
指針和指針類型
? ? ? ? 指針的定義和初始化:
? ? ? ? 指針的使用:
? ? ? ? 指針的應(yīng)用場景:
? ? ? ? 1.有些時候我們無法直接使用變量名來操控想要控制的變量,從而使用指針來間接操控變量(傳址調(diào)用)。
? ? ? ? 2.可以節(jié)省空間,提高運行效率。
????????函數(shù)傳參的時候,參數(shù)是需要壓棧的。如果傳遞一個結(jié)構(gòu)體對象的時候,結(jié)構(gòu)體過大,參數(shù)壓棧的的系統(tǒng)開銷比較大,就會會導(dǎo)致性能的下降,而指針大小只有4(32位)或8(64位)字節(jié),因此在這種情景下傳指針可以有效節(jié)省空間并提高運行效率。
? ? ? ? 指針的大小:
? ? ? ? 指針是用來存放地址的,在32位的機器上,地址是32個0或者1組成二進制序列,一個比特位(bit)可以存儲一個二進制位,一個字節(jié)(byte)有8個比特位,因此需要4個字節(jié)才能存下地址,即指針變量的大小就應(yīng)該是4個字節(jié)。同理可得在64位的機器上,指針變量的大小應(yīng)該是8個字節(jié)。
????????指針的大小在32位平臺是4個字節(jié),在64位平臺是8個字節(jié)。
指針的類型
? ? ? ? 眾所周知,數(shù)值變量都是有類型的,如:char, int, float, double等,那么指針有類型嗎?答案是有的。
指針類型的意義
? ? ? ? 眾所周知,其他變量之所以有各種類型一是需要表示不同類型的數(shù)據(jù)如:整型,浮點型等,二是為了更合理的使用內(nèi)存空間如:char,short,int等,而任何指針的大小都是4或8字節(jié),那指針的類型有什么意義呢?難道僅僅是為了表示所指向的變量是什么類型?
? ? ? ? 指針的類型決定了指針的權(quán)限。
指針+-整數(shù)
? ? ? ? 指針的類型決定了指針 +n(-n)前進(后退)多大的距離(zieof(類型) * n)。
指針的解引用
????????指針的類型決定了,對指針解引用的時候有多大的權(quán)限(能操作幾個字節(jié))。比如: char* 的指針解引用就只能訪問一個字節(jié),而 int* 的指針的解引用就能訪問四個字節(jié)。
指針 - 指針
? ? ? ? 指針 - 指針的絕對值計算的是兩個地址之間的元素個數(shù)。注:只有指向同一片空間且是同一類型的指針相減才有實際意義!
指針的關(guān)系運算
? ? ? ? 指針是可以進行關(guān)系運算的:
sp:
? ? ? ? C語言標準規(guī)定:允許指向數(shù)組元素的指針與指向數(shù)組最后一個元素后面的那個內(nèi)存位置的指針比較,但是不允許與指向第一個元素之前的那個內(nèi)存位置的指針進行比較。
野指針
? ? ? ? 在有些場景下,我們并不會在創(chuàng)建指針后就立刻使用它,為了避免它成為一個野指針,我們需要將它初始化成 NULL(置空),NULL是一個為了避免未使用或不再使用的指針變量成為一個野指針而定義的宏。
什么是野指針?
????????概念:野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)。通俗的講,不知道明確指向的,指向非法空間的指針就是野指針。
? ? ? ? 野指針可能帶來的危害:
????????1.指向不可訪問的地址。危害:觸發(fā)段錯誤。
????????2.指向一個可用的,但是沒有明確意義的空間。危害:程序可以正確運行,但通常這種情況下,我們就會認為我們的程序是正確的沒有問題的,然而事實上就是有問題存在,所以這樣就掩蓋了我們程序上的錯誤。
????????3.指向一個可用的,而且正在被使用的空間。危害:如果我們對這樣一個指針進行解引用,對其所指向的空間內(nèi)容進行了修改,但是實際上這塊空間正在被使用,那么這個時候變量的內(nèi)容突然被改變,當(dāng)然就會對程序的運行產(chǎn)生影響,因為我們所使用的變量已經(jīng)不是我們所想要使用的那個值了。通常這樣的程序都會崩潰,或者數(shù)據(jù)被損壞。? ? ? ? 總而言之,野指針的危害極大!!!
野指針的成因
1.指針未初始化就直接使用
2.指針的越界訪問
3.指針指向的空間已經(jīng)釋放
如何規(guī)避野指針?
????????1. 指針初始化。
????????2. 小心指針越界
????????3. 指針指向空間釋放,及時置NULL
????????4. 避免返回局部變量的地址
????????5. 指針使用之前檢查有效性
二級指針
? ? ? ? 眾所周知,指針變量也是變量,而變量都是有地址的,所以指針變量也有地址。我們把指向普通類型(非指針類型)變量的指針變量稱為一級指針,把指向一級指針的指針變量稱為二級指針,即二級指針是用來存放一級指針的地址的。三級指針同理。