溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言中如何使用指針變量

發(fā)布時(shí)間:2021-07-02 16:32:14 來源:億速云 閱讀:479 作者:Leah 欄目:互聯(lián)網(wǎng)科技

今天就跟大家聊聊有關(guān)C語(yǔ)言中如何使用指針變量,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。




當(dāng)我們將一個(gè)指針變量定義好之后,接下來需要考慮的問題就是如何來使用這個(gè)指針變量了。前面學(xué)習(xí)普通變量的時(shí)候,我們知道,一個(gè)變量的操作其實(shí)就是分成讀和寫兩個(gè)步驟。而指針變量在平時(shí)使用的時(shí)候,也是主要分成讀和寫兩個(gè)操作步驟,不同于常規(guī)變量的是,指針變量的賦值運(yùn)算其實(shí)是寫入一個(gè)普通變量的地址,我們將這一個(gè)過程稱為指針變量的“指向操作”。而對(duì)指針變量讀取的時(shí)候,由于指針變量存放的是某一個(gè)變量的地址,而讀取某一個(gè)地址這個(gè)操作往往是沒有意義的,因此在指針變量讀取的時(shí)候,大多數(shù)情況我們都是讀取指針變量指向的那個(gè)變量里面的內(nèi)容。
指針變量的指向操作,其實(shí)就是將定義好的一個(gè)指針變量指向某一個(gè)變量或者內(nèi)存區(qū)域,其方式為:“數(shù)據(jù)類型 *指針變量名 =&指向的變量;“。當(dāng)然也可以先定義指針,再將其指向某一個(gè)變量,即:
“數(shù)據(jù)類型 *指針變量;
指針變量 =&指向的變量;“
在使用時(shí),一定要注意上面“*“號(hào)的用法差異。還需要注意的是,一個(gè)指針變量只能指向與其數(shù)據(jù)類型相同的變量。
一旦一個(gè)指針指向某一個(gè)變量之后,操作這個(gè)指針變量就如同操作其指向的那個(gè)變量了。在操作時(shí),我們使用“*指針變量名“的形式進(jìn)行讀取和寫入,就等同于對(duì)指針?biāo)赶蜃兞康淖x和寫操作。指針變量指向變量的讀取如圖1所示。

 C語(yǔ)言中如何使用指針變量
圖1-指針變量指向變量的讀取  

同時(shí),指針變量指向變量的賦值如圖2所示。

C語(yǔ)言中如何使用指針變量  圖2-指針變量指向變量的賦值

由圖1和圖2中我們可以看出,當(dāng)指針變量p指向了變量a之后,使用*p進(jìn)行操作,就如同在操作變量a。以上就是指針變量的操作,非常簡(jiǎn)單。
需要注意的是,當(dāng)一個(gè)指針被定義好之后,一定要對(duì)其進(jìn)行初始化,即指向某一個(gè)變量的地址,沒有指向任何變量的指針被稱為“空指針”,空指針無法去做任何操作,一旦對(duì)空指針進(jìn)行賦值,那么編譯出來的程序?qū)?huì)無法使用,如圖3所示。

C語(yǔ)言中如何使用指針變量
圖3-指針未指向變量輸出錯(cuò)誤

這種沒有指向任何變量的指針被稱為“野指針“,注意不是”空指針“,空指針和野指針是不一樣的指針,野指針是非法的,空指針是合法的,關(guān)于空指針和野指針的區(qū)別為:
野指針是不知道指向什么地方的指針,它的出現(xiàn)主要原因是沒有對(duì)指針進(jìn)行初始化,或者指針?biāo)赶虻膬?nèi)存塊被釋放之后,沒有將該指針設(shè)置成空指針。
空指針是指指向NULL的指針,NULL為C語(yǔ)言定義的宏,為0,關(guān)于空指針我們后面會(huì)詳細(xì)講解。
我們前面說過,一個(gè)變量的地址是當(dāng)我們?cè)诙x這個(gè)變量時(shí)由編譯器主動(dòng)隨機(jī)分配的,因此如果我們?cè)诙x一個(gè)指針變量之后,隨意地對(duì)其賦值,對(duì)于用戶來說,我們不清楚那一塊內(nèi)存地址可用,那一塊不可用。那么這樣操作是不是就是不合法的呢?其實(shí)并不是,比如我們?cè)谧鰡纹瑱C(jī)的時(shí)候,某一個(gè)外設(shè)的地址你可以從數(shù)據(jù)手冊(cè)上面查到,那么我們此時(shí)要定義一個(gè)指針來指向這個(gè)地址,以便給后續(xù)的程序使用,那么這種情況下,我們勢(shì)必需要顯示地將一個(gè)地址賦值給這個(gè)指針變量。反過來說,指針就是由于可以任意地指向任何地方,所以一旦使用不當(dāng),比如將一個(gè)指針指向一些受保護(hù)的內(nèi)存塊并且修改這一塊內(nèi)容,那么會(huì)引起一些不可估量的錯(cuò)誤。
如果對(duì)一個(gè)指針貿(mào)然地賦值一個(gè)常量,那么編譯器會(huì)不知所措,在這種不知所措之下,編譯器只會(huì)報(bào)一個(gè)警告,這個(gè)警告的中文意思就是,將一個(gè)int類型的變量賦值給一個(gè)(int *)類型的變量,如圖4所示。

C語(yǔ)言中如何使用指針變量
圖4-給指針賦值一個(gè)常量

正確的做法是,我們需要將這個(gè)常量強(qiáng)制轉(zhuǎn)換成一個(gè)指針類型,關(guān)于強(qiáng)制類型轉(zhuǎn)換其實(shí)很簡(jiǎn)單,只需要將這個(gè)變量或者常量前面用括號(hào)加一個(gè)你所需要轉(zhuǎn)換的類型即可。如圖5所示。

C語(yǔ)言中如何使用指針變量
圖5-給指針賦值一個(gè)常量地址

現(xiàn)在我們來做一個(gè)實(shí)例,先定義一個(gè)變量a,假設(shè)這個(gè)變量a的地址是我們硬件某一個(gè)外設(shè)的地址,我們可以先編程獲取其地址,如圖6所示。

C語(yǔ)言中如何使用指針變量
圖6-獲取某一個(gè)變量的地址

接著,我們來定義一個(gè)指針變量,并且顯示地將這個(gè)地址賦值給這個(gè)變量,接著,對(duì)這個(gè)指針?biāo)赶虻膬?nèi)存進(jìn)行賦值,我們來看看最終變量a里面的內(nèi)容是否會(huì)跟著改變。既然模擬的是硬件,那么此時(shí)有個(gè)小提示需要注意,我們一定要用“volatile“關(guān)鍵詞來修飾這個(gè)內(nèi)存區(qū)域。如圖7所示。

C語(yǔ)言中如何使用指針變量

看完上述內(nèi)容,你們對(duì)C語(yǔ)言中如何使用指針變量有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI