iOS開發學習筆記 2-4 C語言部分 指針

      計算機有一系列連續編號或者編址的存儲單元(通常所說的內存),這些存儲單元可以單個進行操作,也可以以連續成組的方式進行操縱。指針是能夠存放一個地址的一組存儲單元,指針指的就是內存地址,通常是4個(32位機器)或者8個(64位機器)字節。
     
     1.指針是引用數據類型,因爲本身沒有保存數據,只是保存了數據的地址,間接的找到內存中的數據。
     1-1、&,取地址運算符,用於獲取一個對象的地址。
     例如,p = &i,是把變量i的地址賦值給p;
      1-2、*,間接尋址運算符,當*作用於指針時,表示訪問指針所指向的對象。 
     例如,j = *p,表示把指針p所指向的對象賦值給訪問j,相當於j = i;
     1-2、&和*的優先級比算術運算符高,所以: &、*  > 算術運算符 > 關係運算符 > 相等性運算符 > 邏輯運算符
     例如,++*p等價於(*p)++

     3、指針變量,保存指針的變量;
     
     4、申明一個指針變量
     int* p
     int,int表示該指針變量指向的對象的數據類型是int型;
     *,在申明指針變量時用來表示這是一個指針類型的變量;
     p,指針變量名,存放對象的地址。
     
     5、指針的用法
     5-1、指針可以作爲參數,傳遞變量的地址,相當於多個函數參數共享該變量的地址。
     值傳遞:將變量複製一份,相當於兩個變量
     地址傳遞:相當於同一個變量,擁有相同的內存區域(地址)
     5-2、指針可以作爲返回值,但是不要返回自動變量,因爲局部變量的生命週期爲函數開始到函數結束,當函數結束後,局部變量會自動銷燬,此時返回的指針所指向的對象便不存在了,會導致野指針問題。
     5-3、指針可以運算,進行加整數、減整數、指針的比較和相減,但運算的單位由指針的類型決定
     例如,int類型指針+1,地址偏移量爲4,因爲int類型佔4個字節;
                 char類型指針+1,地址便宜量爲1,因爲char類型站1個字節;

     6、指針的優點
     6-1、高效的參數傳遞,在函數的參數傳遞過程中,實參複製一份傳遞給形參,複製過程中需要消耗一定的資源,這時如果選擇使用指針傳遞參數的地址,就有非常大的優勢。
     6-2、對動態分配內存的支持,通過指針對動態開闢的內存空間進行訪問,並通過指針實現內存的釋放和回收。
     6-3、對鏈表的支持,指針是將鏈表結構中不連續的內存地址形成鏈的關鍵。
     
     7、指針可能帶來的問題
     7-1、指針未初始化,在C語言中不會對指針指向空間的內容進行檢查,如果指針沒有初始化,使用該指針可能導致無法預測的後果,比如指針指向一塊隨機的內存區域。
     7-2、局部變量被回收,引起的野指針問題。當指針指向一個局部變量時,當一個函數運行結束後系統便自動銷燬了局部變量並回收其內存空間,此時指針便指向了一個不存在的空間,形成野指針問題。
     7-3、指針改變引起內存泄露,例如:
int *p = malloc(sizeof(int) * 5);//分配5個sizeof(int)大小的地址
int i = 1;
p = &i;
     這段代碼中,指針p首先指向由malloc()函數開闢的內存空間,隨後p又被賦值爲int變量i的地址,一開始由malloc()函數開闢的內存空間變再也無法訪問,也無法釋放,從而引起內存泄漏。
     7-4、指針越界,訪問數組時超過數組邊界引起程序異常終止。

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