-->

计算机存储原理


为什么学这个

想要了解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这个字符串,假设他的地址为

image

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呢?

image

然而对于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"

//#这个是预处理的意思

//头文件有两种定义方式
/*
*第一种就是尖括号<>:使用这种一般都是系统定义的函数,编译器首先会去系统指定的路径寻找这个头文件,如果没有找
*到编译器报错。
*第二种就是双引号"":使用这种一般是用户自定义函数,编译器首先会在当前的路径寻找头文件,如果没有找到那么他会
*去系统指定的路径去寻找这个头文件,如果还没有找到则编译器报错
*/
posted @ 2024-06-14 09:54  wuju  阅读(210)  评论(0)    收藏  举报