在日常學習中,我們需要了解的只是:
記憶體中每個位置都是由獨一無二的位址標識
記憶體中的每個位置都包含乙個值
通過指標訪問指向的值的過程稱為間接訪問(indirection)或者叫做解引用指標(dereferencing the pointer),執行間接訪問的操作符就是單目運算子』*』
這裡一定要注意,在變數宣告時使用的』』,與解引用時使用的』'有著本質上的區別,不可以將二者作用混淆
int a =50;
int* b =
&a;//這裡的'*'主要起宣告的作用,告知程式當前變數b是乙個指標型變數
printf
("%d"
,*b)
;//這裡的'*'是單目運算子,對指標型變數b執行取值操作
編寫程式過程中我們往往會定義諸多的變數名實現對值的操控,在這個過程中,變數名與記憶體位址的關聯並不是硬體提供的,它是由編譯器為我們實現的,所有這些變數名給了我們一種更方便的方法記住位址,但是–++硬體仍然通過位址來訪問記憶體位置++#include
intmain()
執行結果b=
17824784
*b=50
&b=17824772
int
main()
null作為乙個特殊的指標變數,表示不指向任何位址int
main()
else
return0;
}
觀察上述程式不難發現,在程式編譯過程中,null指標和0值是完全等價的,這是一種基於源**的約定,有助於我們測試乙個指標變數是否為null ,而null指標的實際值不一定是0
對乙個null指標進行解引用操作是違法的,因為null指標並沒有指向任何內容,所以在對指標進行解引用之前,必須要確定指標是否為空
int a=10;
int* b=
&a;*b=20-
*b;b=20-
*b;
上述第三條語句是合法的,第乙個表示取到該記憶體位址內的變數,對它進行重新賦值,第二個表示,取出該記憶體位址內變數的值,利用值進行計算
第四條語句是非法的,指標變數不能直接作為左值進行賦值操作(k&r c)
int a=50;
int* b=&a;
int** c=&b;
int
mystrlen
(char
* str)
return length;
}int
main()
利用指標遍歷陣列#include
void
main()
;int sum =0;
int* p1;
for(p1 = score; p1 <
&(score[7]
); p1++
)}
ps:陣列名就是陣列首位元素的位址int
main()
;int
* num =
&p[0];
int* pnum = num +2;
ptrdiff_t n =
(pnum +1)
- num;
//兩個指標變數之間做差,得到結果是一種有符號整型
//表示兩個指標在記憶體中的距離(以陣列元素長度為單位,而不是位元組長度)
printf
("*num=%d,*pnum=%d\n"
,*num,
*pnum)
;printf
("(pnum+1)-num=%d\n"
, n)
;return0;
}
注意:上述指標之間相減求距離的前提是位於同乙個陣列內,否則結果無意義
ps:同乙個陣列內的指標可以進行』<』,』<=』,』>』,』>='運算,此模擬較表示式可以對指標在陣列中的位置做出比較
運算結果
*num=1,*pnum=3
(pnum+1)-num=3
除了null指標外,再也沒有任何內建的記法用來表示指標常量,因為程式設計師通常無法**編譯器會把變數放到記憶體中哪個位置,當出現極特殊情況我們需要自定義指標常量時,一般採取將整形資料強制型別轉換為指標常量的方式 c語言指標詳解
一.指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。1.指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部...
C語言指標詳解
類似於 int p char p 或者自定義型別的 person p struct p 這些都是基本的指標變數,不管什麼型別的指標變數都是乙個存位址的變數,所以它們的大小都是四個位元組 還有一種void p 型別,類似於 js 或者 c 的 var 可以傳入任何型別變數的位址,也可以轉換成任何型別變...
C語言指標詳解
c語言指標應用 一 指標是什麼 指標是乙個特殊的變數,它存的是記憶體裡的乙個位址。指標四要素 1.指標的型別 把指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別如下 1 int p 指標的型別是int 2 char p 指標的型別是char 3 int p 指標的型別是int 4...