【基礎C語言】指針相關整理

指針相關整理

什麼是指針

指針是一種數據類型(代表內存地址的整數),使用它定義的變量叫作指針變量。

爲什麼使用指針(什麼情況下該用指針)

  1. 函數之間無法通過傳參共享變量。
    函數的形參變量屬於被調用者,實參屬於調用者,函數之間的名字空間相互獨立,是可以重名的,函數之間調用的數據傳遞都是值傳遞(賦值、內存拷貝)。
  2. 使用指針可以優化傳參的效率。
  3. 堆內存無法與標識符建立聯繫,只能與指針配合使用。

如何使用指針

定義: 類型* 變量名p:

  1. 指針變量與普通變量使用方法有很大差別,一般以p結尾,與普通變量區分開。
  2. 星號表示此變量是指針變量。一個* 只能定義出一個指針變量,不能連續定義。
 int* p1,p2,p3; //p1是指針,p2,p3是int變量;
 int *p1,*p2,*p3; //三個指針變量
  1. 類型表示的是存儲是什麼變量。它決定了當通過地址訪問這塊內存時訪問的字節數。

  2. 指針變量的默認值也是不確定的,一般初始化爲NULL(空指針)。

    賦值:指針變量 = 地址。
    棧地址賦值:
    int num=0;
    int* p=NULL;
    p=#
    堆地址賦值:
    int* p=malloc(4)
    解引用(根據地址訪問內存):*指針變量名 <=> 變量
    1. 根據變量中存儲的內存編號去訪問內存中的數據,訪問多少個字節要根據指針變量的類型。
    2. 如果指針變量中存儲的地址出錯,此時可能發生段錯誤(這是賦值產生的錯誤)。

使用指針注意事項

空指針

指針變量的值爲NULL(大多數是0,也有特殊情況是1),這種指針變量叫空指針,空指針不能進行解引用(即* 指針變量),NULL被操作系統當做復位地址了(存儲了系統重啓縮需要的數據),當操作系統察覺到程序訪問NULL位置的數時就會向程序發送段錯誤的信號,程序就會死亡。
ATTENTION:空指針還被當作錯誤標誌,如果一個函數的返回值是指針類型,實際返回的值是NULL,則說明函數執行失敗或出錯。

在c語言代碼中應該杜絕空指針進行解引用,當使用來歷不明的指針(調用者提供的)前,應該先判斷是否爲NULL。
#define NULL ((void*)0)
if(NULL == p)
{
}

野指針

指針變量的值是不確定的或者是無效的,這種指針叫做野指針。
使用野指針不一定會出問題,可能產生的後果如下:
1、一切正常
2、段錯誤
3、髒數據

ATTENTION :雖然野指針不一定會出錯,但野指針比空指針危險更大,因爲野指針是無法被判斷出來的、也無法測試出來,也就意味着一旦出錯無法杜絕。
雖然野指針無法測試也無法判斷出來,但是所有野指針都是人爲製造出來的,最好的方法就是不生產野指針
1、定義指針變量時要初始化。
2、不返回局部變量的地址。
3、資源釋放後,指向它的指針及時置空。

指針的運算

指針的本質就是一個整數,因此從語法來說,整數能使用的運算符指針都能使用。
不是所有的運算符對指針變量都是有意義的。

    指針+整數    <=>    指針+寬度*整數    向右移動
    指針-整數    <=>    指針-寬度*整數    向左移動
    指針-指針    <=>    指針-指針/寬度    計算出兩個兩個指針之間相隔多少個元素

指針與數組(數組名是數組的首地址)

數組名就是指針(常指針),數組名與數組首地址是映射關係,而指針是指向關係。

由於數組名就是指針,所以數組名可以使用指針的解引用運算符,而指針也可以使用數組的[ ]運算符。

使用數組當函數的參數時:

數組會蛻變成指針,意味着數組的長度就丟失了,因此需要額外添加一個參數用來傳遞數組的長度。

指針與const

const int* p; 保護指針指向的數據,不能通過指針解引用修改內存的值。
int const *p; 同上。
int * const p; 保護指針變量,指針變量被初始化之後不能再顯式修改賦值。
const int *const p; 既不能通過指針解引用修改內存的值,也不能初始化之後不能再顯式修改賦值。
int const * const p; 同上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章