《C和指標》閱讀筆記 指標

2021-07-25 03:20:41 字數 1158 閱讀 8971

無論是程式設計師還是計算機都無法通過值的位模式來判斷它的型別。型別是通過值得使用方法隱式確定的。編譯器能夠保證值的宣告和值的使用之間的關係時適當的,從而幫助我們確定值的型別。

宣告乙個指標變數並不會自動分配任何記憶體。在對指標間接訪問前,指標必須進行初始化:使它指向現有的記憶體,或者它分配動態記憶體。對未初始化的指標變數間接訪問操作是非法的,而且這種錯誤常常難以檢測。其結果常常是乙個不相關的值被修改。這種錯誤是很難被除錯發現的。

null指標就是不指向任何東西的指標。它可以賦值給乙個指標,用於表示那個指標並不指向任何值。對null指標執行間接訪問操作的後果因編譯器而異,兩個常見的後果就是分別返回記憶體位置為零的值以及終止程式。除了null指標之外,再也沒有任何內建的記法來表示指標常量,因為程式設計師通常無法**編譯器會把變數放在記憶體中的什麼位置。在極少見的情況下,我們偶爾需要使用指標常量,這時我們可以通過把乙個整型值強制轉化為指標型別來建立它。

eg:*(int *) 100 = 25;

在指標上可以執行一些有限的算術運算子。你可以把整型值加到乙個指標,也可以從乙個指標減去乙個整型值。在這種情況下,這個整型值會進行調整,原值將乘以指標目標型別的長度。這樣,對乙個指標加1將使它指向下乙個變數,至於該變數在記憶體中佔幾個位元組與此無關。然後,指標運算只有作用於陣列中其結果才是可以**的。對任何並非指向陣列元素的指標執行算術運算(但常常很難被檢測到)。如果乙個指標減去乙個整數後,運算結果產生的指標所指向的位置在數字第乙個元素前,那麼它是非法的。加法運算稍有不同,如果結果指標指向陣列最後乙個元素後面的那個記憶體位置仍是合法(但不能對這個指標執行間接訪問操作),不過再往後就不合法了。如果兩個指標都指向同乙個陣列中的元素,那麼它們可以相減。指標減法的結果經過調整(除以陣列元素型別的長度),表示兩個指標在陣列中相隔多少個元素。如果兩個指標並不是指向同乙個陣列的元素,那麼它們之間進行相減就是錯誤的。任何指標之間都可以進行比較,測試它們是否相等。如果兩個指標都指向同乙個陣列中的元素,那麼它們之間還可以執行<,<=,>和》=等關係運算,用於判斷它們在陣列中的相對位置。

eg:

inti[10];

int*p = &i[0];

intoffset = 3;

p += offset;(a)

p += 3;(b)

b的效率更高。

C和指標 閱讀筆記

eof end of file 檔案結束標記 int a int a和int a是相同的但是後者會造成誤解int a,b,c 應寫成int a,b,c。用typedef來建立新的型別名而不是用 define,define不能正確的處理指標型別,如下例中bc就會宣告失敗,而更複雜的函式指標,陣列指標明...

C 筆記 C 陣列指標和指標陣列

char p 10 為陣列指標,實際上相當於二維陣列,也就是指向乙個一維陣列的指標 p可以單獨看做指向陣列的指標 比如這樣 int b 2 int cc 2 2 1,2 3,4b cc b cout 這樣的賦值是可以的,b指向的陣列的大小一定要和cc的第一維陣列大小一致,這裡輸出,4,因為b 這個時...

《c和指標》 指標章節學習筆記

int main 使用指標間接訪問變數的值以及修改變數的值 int main pa是指位址,pa是指取這個位址的內容 則 a是變數a的位址,a就是解引用a的值 即變數a int main 使用指標的指標間接訪問變數的值 pa int main g cp 1 1 先運算 cp,再進行 1操作 2 首先...