指针也是一种数据类型 ,在内存当中,代表一块4字节大小的区域(32位操作系统),这个区域存的值是一个地址。
跟int这种数据类型一样 ,内存上同样代表一个4字节大小的区域,只不过区域上存的是int类型的数字而已。
内存区域都有一个首地址,通过&符号我们可以拿到该区域的首地址,但指针类型还可以通过*符号来操作指针内存区域上所储存的地址所指向的对象。这是唯一的区别
int num=1;在栈空间上有一个4字节大小的区域,别名为num, 上面的值是1,假设区域首地址是0x00012;
int* p=# 在栈空间上申请一个4字节大小的区域,别名为p。上面的值是0x001。区域本身的首地址假设是0xff11;
int**p1=&p;在在栈空间上申请一个4字节大小的区域,别名为p1。上面的值是0x123。区域本身的首地址假设是0x456;
double *p2=malloc(size of(double)):分三步来理解
1.在堆空间中申请了一个8字节大小的内存区域,假设首地址是0x0012;
2.double *p2=NULL。在栈空间申请了一个4字节大小的内存区域,别名为p2,区域上的值是一个地址,目前指向NULL,即000000;
3.指针赋值指针。将堆空间申请的内存首地址赋值给p2,即p2上的值变为了0x0012.
image.png
image.png
内存的图形化表达
int a=4;
int*a1=&a;
//二级指针
int ** a2=&a1;
int b=9;
int* b1=*b;
image.png
a=b;
a1=b1 ;
赋值操作 可以理解为将目标内存的数据 拷贝 到对应的内存中,即将b区域内存中的9拷贝到a区域中,b1区域中的0xff12 拷贝到 a1区域中。
image.png
结构体的内存表现
struct MyStruct
{
int age;
char* name;
};
void main() {
MyStruct my;
my.age = 18;
my.name = "reborn";
}
image.png
网友评论