(以下為本人的一些學習心得,有錯誤希望大家能指出來)
在初步了解指標之前,我們先看一下指標的定義(來自《c語言入門經典第五版》):
可以儲存位址的變數叫做指標(pointers)。我們都知道在計算機中,程式都是儲存在記憶體中的,cpu通過位址對其進行讀取和寫入資料。平時所用到的變數名,都只是一層包裝,是為了方便開發人員而設定的。(畢竟正經人誰會記得自己變數的位址啊,我不會記,你會記嘛?下賤哈哈哈)
將這層包裝撕開,得到其實就是位址以及位址中的內容。但有時候我們又有一些高階操作涉及到記憶體位址,這個時候指標就為我們提供了乙個操作性更強的選擇。
其中* 運算子,即取消引用運算子(我更喜歡叫它取消引用運算子,原因後面就知道了)和&運算子,即定址運算子是指標的精髓。
1.「 * 」 運算子(取消引用運算子)
首先我們先了解這麼一段話:
"* "運算子,我們稱為取消引用符號,意思就是告訴編譯器這個變數裡的內容不是我要找的(第一層),變數裡內容即某個位址上的內容才是我(第二層)。
這個時候就有乙個問題,編譯器去找了那個位址的內容,因為只有起始位址,所以編譯器會很迷惑,你只要這乙個位址空間的內容還是連續幾個的?我拿到了以後咋辦呢?我又不知道它是什麼型別的資料。所以我們在宣告指標的時候不僅需要* 運算子還需要指定其型別,這樣編譯器根據型別知道讀取幾個位元組,以及如何處理這個資料。然而有乙個特殊的型別,那就是void型別。是空型別,就是啥型別都不是?我們在宣告乙個變數的時候不可能不宣告其型別,因為編譯器需要分配一塊空間給這個變數,但是沒有型別,編譯器就不知道應該給多大的空間。那麼為什麼指標型別的變數可以宣告為void型呢?編譯器不是也要分配空間嗎?理由其實也很簡單,我們考慮一下指標的值是什麼?是乙個位址。在計算機中,無論是32位還是64位的作業系統,記憶體的位址長度肯定是固定的(32位的為4個位元組,64位的為8個位元組)。也就是說指標的大小是固定的,只不過需要在使用指標指向的內容之前編譯器要知道資料是什麼型別的,所以可以暫時把指標宣告為void型,而編譯器依舊會分配一塊固定大小的空間給這個指標。
2.&運算子(定址運算子)
然後我們再來了解一下另乙個運算子:
"&"運算子,我們稱為定址運算子,畢竟咱有了指標了,不知道位址也沒法用啊。所以通過這個運算子我們就可以得到變數在記憶體中的位址。
我相信很多人第一次見到這個運算子都是在scanf()函式中遇到的,當時大家可能會好奇,也可能就當作語法記住了。現在回頭一看是不是豁然開朗?你輸入乙個資料,編譯器得知道往哪去存對吧,那編譯器不想自己去根據變數名猜位址,可不就讓你自己來嘛。(滑稽)所以我們通過&運算子加乙個變數,這樣就給了scanf()函式乙個引數即要存入的位址。這樣一看,scanf()也只不過是乙個很簡單的void型函式,有兩個引數,第乙個是字串型別,說明你要怎麼輸入資料,輸入什麼樣子的資料,第二個引數就是要存放的位址。至於原始碼嘛,還沒看。。。
3.指標的用法
好的,我們了解了指標的原理以後就很容易明白指標的用法了。
1)宣告和初始化
我們在宣告指標的時候一定得記得初始化!我們在宣告指標的時候一定得記得初始化!我們在宣告指標的時候一定得記得初始化!畢竟編譯器隨機分配的空間裡誰也不知道原來放的是什麼內容,訪問這個不知道是什麼值的位址以後也不知道會拿到什麼資料,所以最好初始化為null,表示裡面的值現在啥都沒指(其實就是0)這樣就不會意外覆蓋記憶體,很安全。當然,想直接指向某個變數也可以初始化為其位址(用定址運算子)
2)使用時不加* 的用法
不加取消引用運算子的時候指標看起來就是乙個很乖巧的普通變數,也就是簡簡單單的第一層,就把它當作乙個普通變數就好了。只不過這個變數裡面存放的值是乙個位址。你對它進行算術操作,它的值也會變,也就是說位址的值變了,這個時候指向的記憶體的內容就不是原來的那塊位址了。對了,這裡對指標的運算我們每次加1其實是加乙個指標型別的位元組數,即char* 型別的指標每次++,就是加乙個位元組;換成int* 型別就是加4個位元組(奉勸大家不是連續的記憶體位址訪問的話,別瞎搞,容易出事)
3)使用時加* 的用法
加了* 運算子即取消引用運算子,那麼就是處在了第二層(之前埋下的伏筆來了),那麼這個時候作為乙個整體看作乙個變數的話,* pointer等同於指標指向的那個變數的內容,這個時候修改* pointer是直接在記憶體級修改的,所以也相當於修改指向的變數的內容。
注意:在指標的運算中," * "和++的優先順序相同,所以使用*pointer++的本意是指標指向的內容+1,但是實際卻是指標的值先++,然後再引用指標指向的內容,所以大家盡量記得加括號。
c語言初學 初涉指標
指標 指標是乙個 4 bytes integers,儲存的是記憶體位址,1.定義 型別 變數名 2.使用const宣告指標變數 1 指向const的指標變數 int const p 等效於 const int p 該類指標變數指向的記憶體空間的內容是不可變的。eg.const int a 1 con...
C語言 指標初入(一)!
2.指標變數的定義 3.指標變數的賦值 4.開闢動態儲存單元 5.指標運算子 指標嘛?這玩意,還真挺難!每次程式設計序遇到指標時 指標,是c語言的一種派生型別,指標變數儲存的值是某 記憶體位址 使用指標可以更加靈活地組織具有複雜關係的資料,簡化操作過程,提高程式的執行效率。可以通過其儲存位址間接訪問...
c語言指標詳解
一.指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。1.指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部...