C语言复习:内存模型1
数据类型本质分析
数据类型概念
- "类型"是对数据的抽象;
- 类型相同的数据有相同的表现形式/存储格式以及相关的操作;
- 程序中使用的所有数据都必定属于某一种数据类型;
数据类型本质思考
-
数据类型和内存有关系吗?
- 数据类型占据大小一定的内存空间.
-
C/C++为什么会引入数据类型?
- 不同的数据类型所对应的处理方式/行为/应用方面不同.
数据类型的本质
- 数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。
- 数据类型的作用:编译器预算对象(变量)分配的内存空间大小
-
程序举例,如何求数据类型的大小?
- sizeof(数据类型名);
-
请问:数据类型可以有别名吗?数据类型可以自定义吗?
- 可以(typedef);可以(struct);
数据类型大小
int main() { int a = 10; int b[10] ; printf("int a:%d \n", sizeof(a)); printf("int a:%d \n", sizeof(int *)); printf("int b:%d \n", sizeof(b)); printf("int b:%d \n", sizeof(b[0])); printf("int b:%d \n", sizeof(*b)); printf("hello.....\n"); getchar(); return 0; } sizeof是操作符,不是函数;sizeof测量的实体大小为编译期间就已确定 |
数据类型别名
int main() { //Teacher t1; printf("Teacher:%d \n", sizeof(Teacher)); printf("u32:%d \n", sizeof(u32)); printf("u8:%d \n", sizeof(u8)); printf("hello.....\n"); getchar(); return 0; } 编译结果: test.c: In function 'main': test.c:5:33: error: 'Teacher' undeclared (first use in this function) printf("Teacher:%d \n", sizeof(Teacher)); ^ test.c:5:33: note: each undeclared identifier is reported only once for each function it appears in test.c:6:29: error: 'u32' undeclared (first use in this function) printf("u32:%d \n", sizeof(u32)); ^ test.c:7:28: error: 'u8' undeclared (first use in this function) printf("u8:%d \n", sizeof(u8)); ^ 说明我们自己不能擅自使用自定义的数据类型,只能按规定使用内建数据类型或者按规定使用自定义类型. |
数据类型封装
-
1、void的字面意思是"无类型",void *则为"无类型指针",void *可以指向任何类型的数据。
-
2、用法1:数据类型的封装
-
int InitHardEnv(void **handle);
-
典型的如内存操作函数memcpy和memset的函数原型分别为
-
void * memcpy(void *dest, const void *src, size_t len);
-
void * memset ( void * buffer, int c, size_t num );
-
-
-
-
3、用法2: void修饰函数返回值和参数,仅表示无。
-
如果函数没有返回值,那么应该将其声明为void型
-
如果函数没有参数,应该声明其参数为void
-
int function(void)
-
{return 1;}
-
-
4、void指针的意义
-
C语言规定只有相同类型的指针才可以相互赋值
-
void*指针作为左值用于"接受"任意类型的指针
-
void*指针作为右值赋值给其它指针时需要强制类型转换
-
int *p1 = NULL;
-
char *p2 = (char *)malloc(sizoeof(char)*20);
-
-
5、不存在void类型的变量
-
C语言没有定义void究竟是多大内存的别名
-
-
6、扩展阅读:void类型详解.
数据类型总结与拓展
1、数据类型本质是固定内存大小的别名;是个模具,c语言规定:通过数据类型定义变量。
2、数据类型大小计算(sizeof)
3、可以给已存在的数据类型起别名typedef
4、数据类型封装概念(void 万能类型)
思考1:
C一维数组、二维数组有数据类型吗?int array[10]。 若有,数组类型又如何表达?又如定义?若没有,也请说明原因。
答: C/C++中数组是内置的数据类型,但不是基础数据类型而是构造数据类型,语义上是有限个占据连续物理空间的相同数据元素的有序集合。
数组类型
1、数组类型
2、数组指针
3、数组类型和数组指针的关系
思考2:
C语言中,函数是可以看做一种数据类型吗?
a)若是,请说明原因。并进一步思考:函数这种数据类型,能再重定义吗?
b)若不是,也请说明原因。
答:数据类型本质是固定内存大小的别名。那么函数在定义编译之后内存大小就固定了,我们能用sizeof()输出,所以它是一种数据类型;同理,他是固定内存大小的别名,当我们重定义函数的时候就很有可能改变它的内存大小。继而违背数据类型的本质。而C++的函数重载实际上只是编译器为我们起名字,实际编译出来的汇编中。函数名依然不同。所以是不能重定义的。
变量本质分析
变量概念
-
概念:既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。
-
变量定义形式: 类型 标识符, 标识符, … , 标识符 ;
-
例如:
int x ;
int wordCut , Radius , Height ;
double FlightTime , Mileage , Speed ;
变量本质
1、程序通过变量来申请和命名内存空间 int a = 0
2、通过变量名访问内存空间:(一段连续)内存空间的别名(是一个门牌号)
-
修改变量有几种方法?
1、直接。
2、间接。内存有地址编号,拿到地址编号也可以修改内存:于是指针横空出世了!
3、内存空间可以再取给别名吗?可以,C++的引用。
4、数据类型和变量的关系
通过数据类型定义变量
5、总结及思考题
1:对内存,可读可写;
2:通过变量往内存读写数据;
3:不是向变量读写数据,而是向变量所代表的内存空间中写数据。问:变量跑哪去了?
答:变量只是内存的外显标志,既然可以不经过变量修改值,那么修改的时候变量依然在那里,不为所动。
思考1:变量三要素(名称、大小、作用域),变量的生命周期?
思考2:C++编译器是如何管理函数:
1:函数。
2:变量之间的关系的?
====》引出两个重要话题:
内存四区模型
函数调用模型
重要实验:
int main()
{
//2种方法:通过变量直接操作内存;通过内存编号操作内存
int i = 0;
printf("&i:%d\n", &i);
*((int *)(1245024)) = 10;//发生段错误
printf("i:%d", i);
printf("hello....\n");
getchar();
return 0;
}
程序的内存四区模型
内存四区的建立流程
流程说明
1、操作系统把物理硬盘代码载入到内存
2、操作系统把C代码分成四个区
3、操作系统找到main函数入口执行
各区元素分析
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?