第一章 C语言与内存

1、什么是程序?

程序 = 数据 + 算法

2、计算机运行程序的目的是什么?

要么重视过程,要么重视结果,要么两者皆有。

3、什么是内存?程序运行为什么需要内存?DRAM与SRAM的区别?

内存相当于一个容器一样,要存储东西。计算机或MCU需要内存是要程序让存储于内存中并且让程序跑起来。

SRAM:静态内存,速度快于DRAM,价格昂贵,一般用在CPU的一级缓存,二级缓存,要求特别高的地方;

DRAM:价格相对于SRAM便宜一点,速度要比SRAM慢,DRAM又分为好多代。比如:SDRAM、DDR1 DDR2……LPDDR等等。现在电脑中的内存多用DDR。那么DDR是什么呢?DDR(Double Data Rate)双数据速率,是一个改进的RAM,一个时钟周期可以读写两次,那么速度就变快了。

4、数据(全局变量、局部变量)与代码(程序)存储的方式分为哪几种结构?怎么分的?

按照数据(全局变量、局部变量)与代码(程序)存储的方式的不同,分为冯诺依曼结构和哈佛结构。

冯诺依曼结构:数据(全局变量、局部变量)与代码(程序)存储在同一个空间,而且数据与代码共用一条传输总线。

哈佛结构:数据(全局变量、局部变量)与代码(程序)分开存储。两条传输线,一条数据线,一条命令线。(ps:这里就提到了预取指的命令与作用了。)

以上两者也没有绝对的那个优于那个。各有优势。我们一般的单片机中可能是哈佛结构:程序下载到FLASH中原地运行,用到的数据存储于RAM中。

5、如何管理内存?

分类:有操作系统与无操作系统

有操作系统:我们可以通过操作系统提供给我们的一些接口API来分配内存,这样分配的方式称为静态分配内存;在程序运行的过程中,需要随时分配,随时释放,这种分配方式叫动态分配内存。

无操作系统(裸机):程序需要直接操作内存,编程者需要自己计算内存的使用和安排,这属于静态分配内存。

6、内存的深入理解

硬件角度与逻辑角度

硬件角度:我们实实在在能看到的一个东西,像电脑中的内存条这个东西。

逻辑角度:内存可以随机访问(在内存的有效空间内)。内存实际上是有多个内存单元格子组成的,每一个格子都有一个固定的地址,叫做内存地址,这个格子与内存地址永久绑定。

7、32位的系统或者64位的系统中,这个32位与64位怎么理解?

32位的系统:32位数据线,但一般地址线也是32位。(64位也是如此)。
这个地址线32位就决定了内存地址只能有32位2进制。也就是2^32。也就是4G的内存空间。

三总线的概念:地址总线、数据总线、控制总线。
往内存中写一个数据的过程:控制总线上传输命令(写命令),地址总线上传输要写入数据的内存地址,数据总线上传输数据。

地址总线的数决定了内存的大小。

8、位和字节

1GB = 1024MB
1MB = 1024KB
1KB = 1024B
1B = 8bit

9、内存位宽

内存位宽(内存数据线的数量)是指在一定时间(时间是指一个时钟周期),内所能传送的数据的位数,位数越大,则所能传输的数据量就越大。

10、内存编址和寻址、内存对齐

内存中的每一个格子都有一个编号,这个编号就是内存地址。这个内存地址(一个数字)和这个格子一一对应且永久绑定,这就是内存编址方法。

11、关键:内存编址是以字节为单位的

问题:我们以多大的空间划分一个格子的大小呢?
以一个字节的大小为基本单元对整个内存进行划分。也就是一个格子就是一个字节。
32位的单片机的内存为什么是4G,怎么算的。
2^32 /(1024) = 4194304 KB
4194304KB / 1024 = 4096 MB
4096MB / 1024 = 4GB

12、内存和数据类型的关系

C语言中数据类型的本质就是一个内存格子的长度和解析方法。

char 占1个字节
int 占4个字节
float 占4个字节
double 占8个字节
以上也不是恒定的,也依据机器位宽。

13、内存对齐

内存对齐效率高于非内存对齐(通常硬件支持非对齐访问的)。

14、C语言对内存的封装

比如:int a;
表示编译器帮我们申请了一个int类型的内存格子(长度是4个字节,地址是确定的,但是只有编译器知道),并且把符号a和这个格子绑定。

15、用指针来间接访问内存

指针是什么?一般我们都说指针就是地址。说的严谨一点就是:指针就是一个变量,一个专门用于存放地址的变量。
int *p ; 表示:变量p里边存放的是一个地址,这个地址指向的空间用于存放一个int类型的整数。

16、用数组来管理内存

比如:

#include <stdio.h>
intmain()
{
	int a[5] = {5,4,3,2,1};
 }

Code Block运行结果
可以得出如下结论:
(1)数组名就是数组首元素的地址
(2)a+1,编译器会明白是要a[1]的地址。
(3)地址加1,对应的是在地址的值上加一个数组元素类型。

17、内存管理之结构体

为什么需要结构体?结构体有和好处?
这里就要说说数组的三个特点了:
(1)数组只能存储同种类型的元素
(2)数组大小必须定义时给出,而且多数情况下,数组的空间大小一旦确定就不能再修改
(3)数组的看空间必须是连续的。
为了解决第一个缺点,那么就需要结构体登场了。

比如:

strut people
{
		int age;		//年龄
		char name[20];		//名字
		int height;		//身高
 }

18、内存管理之栈(stack)

什么是栈?
栈是一种数据结构,C语言中用来存储局部变量的。栈是被发明出来管理内存的,是一种维护内存的机制,这就是栈的本质。

栈管理内存的特点:小内存,自动化。
FILO(First in last out)先进后出 栈
FIFO(First in First out )先进先出 队列

C语言中的局部变量是用栈来实现的。局部变量的作用域是函数内部。栈还保存这函数调用所需的所有维护信息。

局部变量在函数运行结束后,栈空间会被释放。生命周期结束。

在C语言中,定义局部变量时如果没有初始化,则值是随机的,为什么?
定义局部变量时,其实就是在栈中通过移动栈指针,来给程序提供一个内存空间和这个局部变量名绑定。而栈是反复使用的,有可能这块内存空间是上次使用过的,上次的值还在其中,那么不初始化则就是这个垃圾值。所以说我们定义的局部变量一定要初始化。

19、内存管理之堆(heap)

堆也是一种动态内存管理方式。
堆内存管理方式特点:随时申请,随时释放,大小块随意。
在上操作系统时,大内存,以及反复使用及释放时,都是通过堆内存来实现的。

动态内存:指程序在运行中取得内存空间,而不是编译时就确定好固定大小的内存空间。

堆内存申请释放都需要手工进行。一定要注意内存泄漏。申请的内存用完之后一定要记得释放掉。

局部变量一般存储于栈中;全局变量一般存储于静态数据区中;动态申请内存存于堆中。

内存一般分为:栈、堆、静态存储区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值