C C 指標雜談(一)

2021-09-10 05:45:44 字數 1304 閱讀 5126

在這樣乙個定義中int* p;這樣就定義了乙個指標變數,p是它的名字,int是它的型別,他現在儲存的位址是一塊不清不楚的位址(這就是乙個野指標),現在使用它時,會造成乙個執行時錯誤,這種情況是一定要避免了,當不知道乙個指標該指向什麼地方時,應該把它指向空的,如int* p = null;這樣定義,這個指標才是有意義的,它現在儲存的記憶體位址是0x00000000。

指標也是有著自己的位址,每當你int*時,記憶體會開闢出一塊記憶體空間給你,這塊空間就儲存了別人的位址空間。如:int a = 10;int* p = &aa的位址是:0x0000fb20;裡面儲存了 10 這個數。p的位址是:0x0000fb30;那麼它的裡面就儲存了 0x0000fb20 這個位址。

正確的使用指標,應當給它一塊正確的記憶體位址(可被讀寫),如int a = 10; int* p = &a,代表了指標的資料儲存的a的位址,還有一點,int 要跟 int 型別對應,double* 也要跟 double 型別對應。

介紹一下指標運算子( * ),在這裡,不代表乘除法中的乘,而是表示對指標的操作。

( * )運算子在左邊時(*p = ***;),代表著想要改變(寫)指標指向的位址。

( * ) 運算子在右邊時(a = *p;),代表著讀取(讀)指標指向的位址。

上面介紹到 int* 會儲存乙個位址,所以當你操作指標時,實際上你就改變了那塊位址的值。

如:int a = 10;int* p = &a當你*p = 20;時,其實是把 0x0000fb20 裡面儲存的數改變成了20,理所當然的,a也改變了,因為 a 的記憶體是 0x0000fb20 ,他並沒有重新被分配記憶體。

同理,當你printf("*p = %d",*p);時,就是讀取出0x0000fb20的值(這裡*相當於在右邊);

當宣告乙個指標時,一定要記得初始化,因為錯誤的使用的乙個指標,會輕易的導致你的程式崩潰,野指標在程式設計中是不被允許的,而空指標是被允許的。

乙個野指標,對於程式設計人員來說,是無法被防範的,當乙個野指標出現,而你又恰好使用到了它,那麼你的程式應該已經在崩潰的邊緣了,因為野指標是無法判斷的,不確定的。

乙個空指標,在程式設計中是執行的,因為它是可以被防範的,能被判斷的,你可以通過乙個 if 語句(if(p == null))來判斷指標是否為空,在某些特殊時候,空指標的設計是不可或缺的。

當你使用指標時,一定要確保它得到了初始化,哪怕是指向 null 都是可以的。

C C 語言雜談

表示開始直接學c 有點分不清c和c 的語法 這裡先找一點,遇到了再補充 c語言和c 語言在語法上面的部分區別 1 c語言的定義必須在最前面,c 可以在任何地方定義,比如 for int i 0 i 100 i s i 在c 中是正確的,但是在c語言中是錯誤的 2 型別強制轉換,c語言必須將型別括起來...

雜談指標 指標的移動

剛剛在群裡看到乙個這樣的問題 monopixel pbyte inc integer monopixel 這個在32位下沒問題,為啥64位不能編譯呢?咋一看,以為是把裡面的值進行累加,後來一想應該是移動一下指標。對於這種移動指標的做法有兩個錯誤 第乙個是用了integer,來轉換指標如果在32位下面...

雜談指標 指標的移動

剛剛在群裡看到乙個這樣的問題 monopixel pbyte inc integer monopixel 這個在32位下沒問題,為啥64位不能編譯呢?咋一看,以為是把裡面的值進行累加,後來一想應該是移動一下指標。對於這種移動指標的做法有兩個錯誤 第乙個是用了integer,來轉換指標如果在32位下面...