內(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個元素的值