对内存四区的再强化

数据类型

开始前先提出两个问题:

  1. 数据类型和内存有什么关系?
  2. 为什么会有数据类型这个概念?

               

数据类型的本质

  • 数据类型是固定大小内存块的别名
  • 数据类型的作用是给编译器分配的内存空间大小
  • 可以通过sizeof(int *)来获得数据类型得大小
  • 数据类型可以有别名,数据类型也可以自定义(typedef)

数据类型的封装

void 万能类型

1、void “无类型”,void * “无类型指针” void *可以指向任何类型的数据

2、数据类型的封装,例如内存操作函数 memcpy和memset

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

3、void 修饰函数的返回值和参数,仅表示无

4、void指针的意义

//C语言规定只有相同类型的指针才可以相互赋值
//void*指针作为左值用于“接收”任意类型的指针
//void*指针作为右值赋值给其它指针时需要强制类型转换
int *p1 = NULL;
char *p2 = (char *)malloc(sizoeof(char)*20);

5、c语言没有明确定义void类型是多大内存的别名

变量

既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。

变量的本质

  • 变量是一段连续的内存空间的别名,相当于一个门牌号
  • 修改变量可以直接修改或者间接修改,通过引用可以给内存空间取别名
int a = 10;
int &b = a;

内存,可读可写;能通过变量往内存中读写数据;

对内存的操作

//通过变量直接操作内存==直接赋值
int i= 1;
printf("&i = %d\n",&i);//输出变量i的内存编号

//通过内存编号操作内存==间接赋值
 *((int *)(6422044)) = 10;
printf("i = %d\n",i);

//间接赋值
char *a = NULL;
a = 6422044;
*a = 20;
printf("i = %d\n",i);

注意:*((int *)(6422044)) 首先(int *)(6422044)告诉编译器按照(int *)这个类型去操作内存(4个字节)。既然可以通过内存编号来操作内存,那么直接将内存编号赋值给指针变量也可以达到相同的效果。

  • 这相当于 int *a <==>*((int *)(6422044)),这里的a = (int *)(6422044),*a = *((int *)(6422044))

如果涉及到内存四区,那么变量的声明周期,函数与变量的关系是怎样的呢?

内存四区

可以去看看这篇内存管理

对内存四区最直观的学习应该是画出对应代码的内存四区图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值