接下來,我們結合下面的例子來理解二級指標的概念。
#include int main(void)
1、指標的定義和本質
如例子中的第7行,它的意思是宣告乙個指標變數one_ptr並給此指標變數賦值整型變數a的位址值。
注意:(1)其中的星號(*)僅僅用來表示變數one_ptr是乙個指標變數(一定要特別注意,one_ptr才是指標變數,而不是*one_ptr);(2)星號(*)在c語言中有三種用法,乘法運算子、間接運算子和在宣告中用來表示指標,後兩種的用法都與指標有關;(3)這裡的資料型別關鍵字int與指標變數本身沒有任何關係(指標變數本身也是有資料型別的,但在c語言中它沒有相關的關鍵字來表示,我們只知道在32位的機器中指標變數通常是4個位元組的,用來儲存乙個32位的位元組位址),僅表示指標變數one_ptr只能用來儲存某個整型資料(如a)的首位址,否則會警告型別不匹配。
同理,例子中的第9行,它的意思是宣告了乙個指標變數two_ptr並給此指標變數賦值像int *這樣的資料型別變數(如one_ptr)的首位址。
總結來說,在乙個指標變數宣告中,靠近指標變數名字的星號(*)是星號的第三種用法,其他部分都是所宣告的這個指標變數將要指向的變數的資料型別。如指標變數one_ptr將要指向的變數的資料型別為int型,指標變數two_ptr將要指向的變數的資料型別為int *型。也就是說int 和*共同決定了變數one_ptr的所有特性並有兩層含義,星號(*)表示變數one_ptr是指標變數,關鍵字int表示這個指標變數one_ptr將要指向的變數的資料型別為整型,類似的道理,int *和*共同決定著變數two_ptr的所有特性。
2、指標變數的位址和值
在c語言中,任何型別的變數都有兩個基本屬性:位址和數值。位址也是乙個數值,在32位的機器中,位址就是乙個32位的無符號整型數。一般通過取位址運算子(&)來獲取乙個變數的位址值。
如例子中,變數a的數值為3,位址為&a;變數one_ptr的值為&a,位址為&one_ptr;指標變數two_ptr的值為&one_ptr,位址為&two_ptr(例子中並沒有列印出這個值)。
例子結果輸出:
&a = 0xbfac7f28, one_ptr = 0xbfac7f28, *two_ptr = 0xbfac7f28
&one_ptr = 0xbfac7f24, *two_ptr = 0xbfac7f24
a = 3, *one_ptr = 3, **two_ptr = 3
*one_ptr和**two_ptr都相當於在使用整型變數a,*two_ptr就相當於在使用指標變數one_ptr。
思考:指標變數的資料型別是什麼?
二級指標與取位址運算子
二級指標與取位址運算子 tanglinux 部落格頻道 csdn.net 接下來,我們結合下面的例子來理解二級指標的概念。cpp view plain copy include intmain void 1 指標的定義和本質 如例子中的第7行,它的意思是宣告乙個指標變數one ptr並給此指標變數賦...
指標與二級指標
int num 10 int p1 int p2 p1 指標的指向結構如下圖所示 0x4000 0x3000 p2 0x2000 p1 num p2 表示的是儲存p2指標的位址 p2 表示的是p2指向的位址,即指標p1存放的位址 p2 表示指標p2指向位址中所存的值,即指標p1指向的位址,即變數nu...
函式指標與取位址符
指標名 類名 函式成員名 函式名不是代表首位址嗎?還是此時還麼有給函式分配位址還是什麼的,表示搞不懂 求大神指導!最好詳細點,謝啦,好的一定採納 最佳答案 函式名可以作為函式的位址,但這是有前提條件的,從函式到指標的隱式轉換是函式名在表示式中的行為,這個轉換僅在表示式中才會發生,這只是函式名眾多性質...