C语言内存四区、数据类型与变量

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 不是向变量读写数据,而是向变量所代表的内存空间中写数据。

猜你喜欢

转载自blog.csdn.net/qq_43716137/article/details/105919706