謝謝邀請。
“指針是C語言的靈魂,指針可以直接操作內存,指針使C語言程序更加高效”,等等等等。相信C語言初學者學到指針時,會看到很多這樣描述指針的話,但是卻往往一頭霧水。
其實C語言的指針并沒有什么難的,將其
我在上個問答中提到C語言中的不同的基礎數據類型主要區別之一就是占用的存儲空間不同,程序是運行在計算機的內存中的,因此C語言程序的變量也是存在于內存中的。
C語言標準規定char類型占用一個字節的存儲空間,對其他整型卻沒有做規定,現在為了解釋的方便,我們假設int類型的數據占用內存4個字節。
假設我們如下定義了兩個變量:
那么,i占用了1字節的內存空間,j占用了4字節的內存空間,請看下圖。
方框表示內存空間,內部表示存儲的值。我們把內存逐字節編號,方框外部的數字表示方框的編號(這樣的內存“編號”即所謂的“內存地址”)。
修改變量i的值,實際上就是修改地址為4000的內存空間里的值。那反過來呢?如果我修改了地址為4000的內存空間里的值,i的值會相應改變嗎?答案是肯定的,請繼續往下看。
上圖中的內存地址“4000”是我為了解釋方便隨意取的。那么,在實際應用中,變量i的地址如何獲取呢?C語言提供了“&”運算符,就是獲取變量地址的。請看下面的例子:
我們取出了i的地址,把它強制轉換為long型,傳遞給p1了。編譯并執行這段C語言代碼,得到如下輸出:
發現變量i的地址被打印出來了,這說明,C語言程序變量的地址也是一個整數。
按照上面的說法,
上面的代碼實例中使用了long型變量p1存儲了i的地址。事實上,C語言有
p1和p2就是C語言中所謂的指針類型,因為i是signedchar類型的,所以定義了signedchar*類型的指針存儲i的地址。j是int類型的,所以定義了int*類型的指針存儲j的地址。
另外,C語言提供了“&”運算符取變量地址,與之對應的,還提供了“*”運算符從相應地址內存里取出數值。
了解了C語言的指針類型和“*”運算符,現在來看看如何“通過修改p1地址處的內存空間里的數值”修改i的值。請看如下C語言代碼:
編譯并執行,得到如下輸出:
編譯運行,發現程序輸出“i=5”,這一值實際上就是通過指針修改的??梢钥闯?,C語言中的指針并沒有什么難的。
在定義變量時,”*“放在變量符號前,可以定義指針變量。在定義完指針變量后,“*”放在變量前,就表示從地址取值的運算符了。另外,“*”還可以表示乘法運算符,讀者自己思考什么情況下,“*”表示乘法運算符。
可以看出C語言中的指針一點也不神秘。題主可以點我主頁,查看我之前的文章,了解更多指針問題:比如為什么int類型的變量j的地址要使用int*p2;定義,而不能使用signedchar*p2;定義,使用指針為何能寫出緊湊、高效的C語言程序等等。
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦