1指標:
*指標的實質就是個變數,它跟普通變數沒有任何區別,指標完整的名字是:指標變數。
int a與int *p 中a與p繫結的記憶體空間都是4個位元組
指標出現是為了間接訪問(cpu間接定址是cpu設計時決定的)
%p與%x列印指標,列印出的值是一樣的
下面四種在效果上是一樣的,編譯器不會報錯:
int *p1 //定義多個是更好理解:int *p1,*p2.---------定義兩個指標。
int *p1,p2和int* p1,p2效果相同-----------定義乙個int指標乙個int型別
int*p2
int * p3
int* p4
*放在運算子左邊的就是左值,右邊的就是右值.
當為左值時:代表記憶體空間,不關注空間裡的值
當為右值時:代表記憶體空間裡的值
2野指標:
野指標:指標指向的位置是不可知(隨機的,不正確的,沒有明確限制的)
野指標和可能觸發執行時的段錯誤(sgmentation fault)
野指標觸發錯誤原理:指標變數在定義時,如果沒有初始化,值是隨機分配的,即指標變數的值是隨機乙個變數的位址(這個變數可能不能被訪問.....)
避免野指標的常規做法:
第一步:定義指標時,同時初始化為null
第二步:在指標解引用之前,先判斷這個指標是不是null
第三步:指標使用完之後,將其賦值為null
第四步:指標使用前,將其賦值。
null:本質是(void*)0,作為乙個特殊的位址。在一般作業系統中這個位址是不可以被訪問的。解引用會觸發段錯誤。
判斷指標是否為null時,都寫成if(null!=p)
而不是if(p!=null)
原因是:當中間用的是==時,在錯誤的寫成=後,這時候編譯器是不會報錯的,很難查出來。當把null寫前面時,錯寫成=時,就會報錯。
3const:
const:在c語言中,用來修飾變數,表示這個變數是常量。
1-:const int *p :p指標指向乙個const int型,p本身不是const,p指向的才是
2-:int const *p :同上
3-:int * const p :p指標指向乙個int型,p本身就是const。
4-:const int * const p :p指標指向乙個const int,p本身就是const.
const修飾的變數其實是可以改的(前提是gcc環境下)使用指標賦值:
int main(void)
const是通過編譯器在編譯時執行檢查來確保實現的(即const型別的變數不能改,是編譯錯誤,不是執行錯誤),所以我們只要騙過編譯器,就可以修改const定義的常量,而執行時不會報錯。
const更多時候是一種資訊的傳遞,告訴編譯器,也告訴讀程式的人,這個變數是不應該被修改的。
4指標與陣列:
對編譯器來說:陣列變數也是變數,和普通變數和指標變數木有本質不同,變數的本質就是乙個位址,這個位址在編譯器中決定具體數值,具體數值和變數名繫結,變數型別決定這個位址的長度
&a是陣列名a取位址,做右值時就是整個陣列(將陣列看成乙個變數)的首位址
* &a與a做右值時的區別:&a是整個陣列的首位址,而a是陣列首元素的首位址,雖然二者在數值上是相等的,但是意義不相同(會導致他們參與運算時會有不同的表現--詳細見後續)
int *p;
int a[10]; :p=&a;//會報錯因為p與&a的型別不一樣,p是int *型別,&a是int (*)[10]型別
C語言高階指標 1
c語言的指標是c語言這門語言的精華所在,當然也是讓很多人詬病的地方。指標是什麼?有這麼一句話 對於錘子來說,一切都是釘子。那麼換句話講指標,即 對於指標來說,一切都是位址 記憶體是由乙個個記憶體單元構成的,每個記憶體單元都有自己的位址。而指標就是用來存放這些位址的。凡是可以用指標來儲存的變數,在指標...
C語言高階 指標的高階 1
目錄 指標定義 指標變數,用於存放位址。位址唯一對應一塊記憶體空間。指標大小 固定32位平台下佔4個位元組,64位8個位元組。指標型別 型別決定指標整數的步長及指標解引用時訪問的大小。指標運算 指標解引用,指標整數,指標 指標,指標關係運算。本章節在此基礎上,對c語言階段指標進行更深層次的研究。字元...
c高階之指標2
1指標與強制型別轉換 int char short 相容型 是同一類屬於整型,他們的儲存方式 即轉換成記憶體中的二進位制的方式 是相同的,只是記憶體格仔長度不一樣。float是一類 double是一類 a做左值存數進去時,是按照a的資料型別來儲存的,用printf 來讀取時是按照裡面的 d,f,c之...