c高階之指標1

2021-07-24 13:55:31 字數 1753 閱讀 5623

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之...