数据类型
开始前先提出两个问题:
- 数据类型和内存有什么关系?
- 为什么会有数据类型这个概念?
数据类型的本质
- 数据类型是固定大小内存块的别名
- 数据类型的作用是给编译器分配的内存空间大小
- 可以通过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))
如果涉及到内存四区,那么变量的声明周期,函数与变量的关系是怎样的呢?
内存四区
可以去看看这篇内存管理
对内存四区最直观的学习应该是画出对应代码的内存四区图: