C语言内存四区、数据类型与变量
1.内存四区:
流程说明
1、操作系统把物理硬盘代码load到内存
2、操作系统把c代码分成四个区
3、操作系统找到main函数入口执行
经典例子:
int a = 0; //全局初始化区
char *p1; //全局未初始化区
int main()
{
int b; // 栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,而p3在栈上
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
return 0;
}
2.数据类型的本质 :
1)数据类型可理解为创建变量的模具:是固定内存大小的别名。
2)数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
注意:数据类型只是模具,编译器并没有分配空间,只有根据类型(模具)创建变量(实物),编译器才会分配空间。
eg:
int a = 10; //告诉编译器,分配4个字节的内存
int b[10]; //告诉编译器,分配4*10 = 40 个字节的内存
printf("b:%p, b+1: %p, &b:%p, &b+1: %p\n", b, b + 1, &b, &b + 1);
//b+1 和 &b+1的结果不一样
//是因为 b 和 &b 所代表的数据类型不一样
//b 代表数组首元素的地址
//&b 代表整体数组的地址
void指针的意义
C语言规定只有相同类型的指针才可以相互赋值
void*指针作为左值用于“接收”任意类型的指针
void*指针作为右值赋值给其它指针时需要强制类型转换
数据类型总结:
1、数据类型本质是固定内存大小的别名,是个模具,c语言规定:通过数据类型定义变量。
2、数据类型大小计算(sizeof)
3、可以给已存在的数据类型起别名typedef
4、数据类型封装概念(void 万能类型)
3、变量
1、程序通过变量来申请和命名内存空间 int a = 0。
2、通过变量名访问内存空间。
变量:一段连续内存空间的别名.
修改变量:直接和间接
总结
1 对内存,可读可写;
2 通过变量往内存读写数据;
3 不是向变量读写数据,而是向变量所代表的内存空间中写数据。