C語言指針學(xué)習(xí)筆記(僅僅是個人記錄)

內(nèi)存四區(qū)

  • 靜態(tài)區(qū):全局變量 字符串 常變量
  • 代碼區(qū):代碼
  • 棧區(qū):編譯系統(tǒng)自動開辟 自動釋放 優(yōu)點:訪問到效率稍微高一點 內(nèi)存不多
  • 堆區(qū):我們程序員來主動開辟 主動釋放 內(nèi)存是很大 效率比棧區(qū)低一點點
  • malloc(); //開辟堆區(qū)的內(nèi)存
  • free(); //釋放內(nèi)存

地址

  • 把內(nèi)存以字節(jié)為單位進(jìn)行編號,每一個編號就是一個地址。地址也是唯一的。

指針

指針的用途

  • 指針作為函數(shù)的參數(shù)傳遞,改變實際參數(shù)的數(shù)據(jù)。 C++引用
  • 指針保存的是地址,地址的方式去訪問內(nèi)存的效率要高!
  • 使用棧中的指針去指向堆中大量內(nèi)存,提升內(nèi)存使用效率。

指針的分類

  • 野指針
    沒有明確指向的指針。有可能指向一個重要的數(shù)據(jù)。誤操作。
    野指針是危險。
    定義指針的時候:為了避免野指針在聲明指針變量的的時候可以通過 int *p = NULL;
  • 空指針
    void *類型的指針(地址)可以強制轉(zhuǎn)換成任意其他類型的指針。

指針的運算:+ - ++ --

  • 由于指針存放的是地址所以指針的運算實際上是地址的偏移
    int *p;
    p+1; p這個地址后面一個地址
    p-1; p這個地址前面一個地址
    p++; p指向原來的地址后面一個地址
  • 偏移量跟指向的數(shù)據(jù)是有關(guān)系的。
    int *p p+1 +4B
    char *p1 p1+1 +1B
    double *p2 p2+1 +8B

數(shù)組

  • 數(shù)組的首地址不是第一個元素的地址,而是第一個存儲單元的地址。

  • 一維數(shù)組
    int a[5] 5個int變量組成的數(shù)組 首地址是第一個元素的地址
    數(shù)組名表示的是第一個元素的地址 例如a 表示的是數(shù)組a 第0個元素的地址

  • 二維數(shù)組
    二維數(shù)組可以看作是由一維數(shù)組嵌套而成的;如果一個數(shù)組的每個元素又是一個數(shù)組,那么它就是二維數(shù)組。當(dāng)然,前提是各個元素的類型必須相同。根據(jù)這樣的分析,一個二維數(shù)組也可以分解為多個一維數(shù)組,C語言允許這種分解。

  • 例子
    Int a[2][4]={1,2,3,4,5,6,7,8}
    a 是指向a[0]這個一維數(shù)組的 所以a的類型是 int()[4]
    a[0] 是指向a[0][0] 這個元素的 所以a[0]的類型是 int

  • 獲取二維數(shù)組m 行n列元素的值的辦法
    下標(biāo)法:a[m][n]
    行指針法:* (a[m]+n) a[m]表示的是二維數(shù)組第m個存儲單元的第0個元素的地址 a[m]+n 表示的是第m個存儲單元的第n個元素的地址 * (a[m]+n)得到的是m 行n列元素的值
    數(shù)組名方法:* (* (a+m)+n) 通過數(shù)組名字來尋址的方法 * (a+m )代表的是第m個1維數(shù)組的第0個元素的地址* (a+m)+n 代表的是第m個1維數(shù)組的第0個元素的地址 * ( *(a+m)+n)代表的是代表的是第m個行的第n個元素的值

僅僅是個人學(xué)習(xí)總結(jié),歡迎大神指教

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容