计算机存储原理
为什么学这个
想要了解C语言,必须要了解C语言的灵魂,也就是C语言的指针,但是想要了解指针,必须要了解电脑的结构
计算机
世界上第一台计算机在1946年在美国被发明的。
计算机由五个部分组成:运算器、控制器、存储器、输入设备、输出设备。
其中运算器和控制器又被称为CPU。
存储器又分为:内存、外存(硬盘)。其中内存掉电丢失数据,外存掉电不丢失数据。
意思就是在电脑上上面运行一个程序或者输入一个文本,都是在内存上面操作,但是按下了保存按键之后它又被转移到了外存。
这个五个部分是由冯诺依曼提出来的,除此之外他还提出
- 计算机由五个部分组成
- 计算机的程序执行顺序由上往下
- 计算机中的数据是由二进制保存的
C语言标准
一开始C语言是由ASCI组织(美国国家标准协会)制定,被称为ASCI C,但是由于权威不足,后来被ISO组织(国际标准化组织)发布,学习嵌入式C语言主要以C99标准为主。
由于C语言的字符都是采用英文字符,但是计算机只能存储逻辑0和逻辑1,所以美国国家标准协会为英文字符制定了一套二进制数字,每个数字对应着相应的字符,这套数字就是标准ACSII码,一共128个字符(7bit)。但是又因为这套标准ASCII码只能为美国所用,C语言是面向世界的语言,所以这套字符的实用性很小,然后又相继加上了欧洲等国家的字符,被称为拓展ASCII码,一共256个字符(8bit)。
中国也有自己的字符集由中国国家标准总局设计,被称为GB2312。后面为了兼容繁体字又相继推出了GBK。
目前世界上最完整的字符集是UTF-8字符集,兼容了各个国家的字符集,基本上很多编译器也可以设置。
存储器
任何的编程语言都是在计算机上面执行的,所以想要了解编程语言,就先要了解计算机的存储器。
计算机的存储器一般是由半导体做成,半导体存储器可以分为只读存储器(ROM)和随机存储器(RAM)。
只读存储器掉电不会丢失数据(相当于外存(硬盘)),随机存储器掉电会丢失数据(相当于内存)。
随机存储器:随机是随时可以读取任意的数据,而不是按顺序执行下来。
随机存储器又分为静态随机存储器(SRAM)和动态随机存储器(DRAM),静态随机存储器的制作工艺相比于动态复杂,一般的电脑都使用动态随机存储器。
动态随机存储器(DRAM):RAM的动态存储单元是利用MOS管的栅极电容可以存储电荷的原理制成的。电容:可以充/放电,存储电荷。正是利用电容是否充满电或者说电荷是否达标来判断逻辑1和逻辑0。
一个电容就可以表示1位(bit)二进制,以此类推8个电容就可以表示8位(bit)二进制,也正是因为拓展ASCII码256个字符,刚好就8位,也就是8个电容。所以以8位(bit)为单位形成字节,也就是8位(bit)=1字节(byte)。
- 计算机处理数据最小的单位就是:bit
- 计算机处理数据最基本的单位就是:byte
哪么计算机那么多个电容,怎么样可以快速找到每一个电容呢?
那就是给每一组(8个)电容分配序号,就拿32位(bit)的电脑而言。
32位(bit)就是:0000 0000 0000 0000 0000 0000 0000 0000 - 1111 1111 1111 1111 1111 1111 1111 1111
十进制就是:0-4294967296,十六进制就是:0x0000 0000-0xFFFF FFFF。
也就是一共有这么多组电容:4294967296 (b)= 4194304(kb)= 4096(Mb)= 4GB。(除以1024)
以此类推在64位的电脑中也是如此(0x0000 0000 0000 0000 - 0xFFFF FFFF FFFF FFFF)这么多组电容
如果在键盘中输入hello这个字符串,假设他的地址为

ASCII码占8(bit)1个字节,所以一个字符也是8(bit),每一个存储地址占8位(bit) = 1字节(byte)刚好对应一组电容。
那么依次类推,存储一个int型的数据那就是4个字节32位,那就需要(0x0000 0000 - 0x0000 0003)刚好4个字节,4组电容,32个电容。
需要注意的是内存是易失性存储器,键盘输入是先放在内存(随机存储器)中,掉电就会丢失数据,但是保存之后,就会放在外存中,掉电不会丢失数据。存储器中的单元个数和电脑位数有关,每个存储单元是一个字节,也就是8个电容,一组电容。
C语言架构
C语言是一门面向过程的语言,所谓的面向过程就是把一件“大事情”分割成很多件“小事情”来完成,很多件“小事情”完成了之后,“大事情”也随之完成了。
不管在任何时候C语言程序启动的时候,第一步总是先找到main函数去执行。但是main函数返回值必须是整形,并且main函数可以没有参数如下:
int main(void)
{
}
还有一种情况main函数返回值还是整形,并且main函数可以有两个参数。
int main(int argc,char * argv[])
{
}
第一个 参数argc只能为正整数或者0,因为他要当做第二个参数argv的数组下标。
注:对于数组下标为什么一定是正整数和0呢?

然而对于argv他是一个数组,数组的每一个元素都是字符型指针,也就是每一个元素都是字符串。这每一个字符串是从主机环境中(linux系统的中断输入)获取字符串的,所以第一个字符 串一定是路径文件,可以用的也就是第二个开始到最后一个argc(1---argc-1)数组下标。
//对于这里面的每一个符号的解释
int main()
{
return 0;
}
-
return这个关键字,它会在执行到它的时候回把这个参数(0),这里指的是0,传递给exit(int status)这个函数,传递的就是他的参数status,当这个参数接受的是0时,此时那么程序是正常终止,如果传递的不是0,此时那么程序就会异常结束。如果在其他的函数使用了这个关键字并且返回了一个值(a),那么调用这个函数并且接收的值就是这个(a),只要不是在main函数中使用这个关键字,那么程序就不会结束。 -
如果在程序中函数直接使用
exit(0)那么程序程序会直接结束,不管在任何地方程序都会直接结束。
int add()
{
return 0;
}
int main()
{
printf("1\n");
add();
printf("2\n");
return 0;
}
/*此时程序会打印1和2*/
int add()
{
exit(0);
}
int main()
{
printf("1\n");
add();
printf("2\n");
return 0;
}
/*此时程序只会打印1*/
- 因为在程序执行到
exit();的时候程序直接结束。而return只会结束当前执行的函数。 ;在C语言中属于结束语句
对于头文件
#include <stdio.h>
#include "xxx.h"
//#这个是预处理的意思
//头文件有两种定义方式
/*
*第一种就是尖括号<>:使用这种一般都是系统定义的函数,编译器首先会去系统指定的路径寻找这个头文件,如果没有找
*到编译器报错。
*第二种就是双引号"":使用这种一般是用户自定义函数,编译器首先会在当前的路径寻找头文件,如果没有找到那么他会
*去系统指定的路径去寻找这个头文件,如果还没有找到则编译器报错
*/

浙公网安备 33010602011771号