内存可以想象成map (STL)
内存地址-MAP的ID | 内存地址上存储的数据-MapID对应存储的数据 |
|
|
|
|
|
|
0012FF7C | 0 |
0012FF7B | 0 |
0012FF7A | 0 |
0012FF79 | 10 (十进制16的十六进制数) |
Int i =16 栈向上生长,高地址向低地址分配空间
Int 4字节 一般内存由字节为单位
Int 可以理解为是一个结构体
Typedef int
{
内存地址 &I 取得是int结构中的地址
内存地址所存储数据
}
Int* p = &i. 定义一个int型指针,它指向了int型变量的地址
|
|
|
|
|
|
0012FF7C | 0 |
0012FF7B | 0 |
0012FF7A | 0 |
0012FF79 p | 10 *p |
P相当于是地址 *p相当于是 内存地址上存储的数据
变量 I 对应了内存的地址与地址上存储的数据
&I 对应了内存地址
指针 p 对应变量i的地址
*p 对应了i内存地址上所存储的数据
当然 指针不是一直在那里 他是可以移动的,可以指向别的内存
这里仅举出了int*类型指针,但是其他的道理是一样的,例如:
typedef struct
{
int a1;
int a2;
}st_test,*pst_test;
st_test st1; 当这个结构体创建对象的时候,跟上面定义整形变量i一样
int i;
分配内存情况:
|
|
0012FF80 |
|
0012FF7F |
|
0012FF7E |
|
0012FF7D |
|
0012FF7C |
|
0012FF7B |
|
0012FF7A |
|
0012FF79 |
|
st1.a1分配了4个内存地址
st1.a2分配了4个内存地址 总计分配了8个内存地址空间
这里pst_test指向了向他们分配的地址. 其他的不用再多说了吧。
对于数组与指针:
数组要么在静态存储区被创建(如全局数组),要么在栈上创建.数组名对应着(而不是指向)一块内存,例如 int a[2];内存分配:
|
|
0012FF80 |
|
0012FF7F |
|
0012FF7E |
|
0012FF7D |
|
0012FF7C |
|
0012FF7B |
|
0012FF7A |
|
0012FF79 |
|
分别对应着a[0],a[1]
其地址与容量 在生命周期内固定不变的。
而指针可以随时指向任何类型的内存块,它的特征是可变,灵活但危险。