一、基础知识
(一)冯诺依曼体系
1、存储器:内存
存储程序的思想:按照存储器中指令的顺序
2、存储器的分类
1)主存:内存(C盘)
2)外存
3)寄存器是cpu内部的高速存储器,数目少,速度快,cache在cpu内部,外存和内存(主存)都在CPU外。
3、程序
广义:为了实现一个功能设计的工作步骤
程序:系统可以识别的一组有序指令(二进制),存储在磁盘(硬盘属于外存)上,只有在执行的时候才加载到内存。
(二)数值表示
1、数值数据:能够进行数值运算得出确切数值
非数值数据:不能进行数值运算得出确切数值
字符数据通过ASCII码转化成二进制编码
2、二进制、八进制、十进制、十六进制
1)十六机制:数码123456789abcdef
2)十六进制前缀0x
3、原码、反码、补码
1)正数的原码、补码、反码等于他本身
2)负数的原码符号位是1,其余位不变
负数的补码的符号位是1,其余位按位取反
负数的反码符号位是1,其余位按位取反,末尾加一
(三)程序的编译和调试
1、GCC编译器
2、编译文件是否正确
1)gcc test.c -o test编译是否正确
2)gcc test.c -o test -Wall:如果语法有不规范的,作为一个展示
3)./test执行一个文件
3、程序调试
%s __FILE__ 显示文件名
%s __FUNCTION__ main函数
%d __LINE__显示行
5、一个程序包括数据结构和算法
二、C语言数据类型
(一)bool类型
1、bool:非零(true),零(false)
2、需要引入头文件
#include<stdbool.h>
3、举例
4、由于bool使用频率高,所以去除头文件,加上_Bool这样一个数据类型
5、用数据类型_Bool,则变量只能赋值数据,不能赋值true/false
如果需要true/false就要用带宏的形式的头文件
#define 1 true
(二)char类型
字符型数据是不具有计算能力的文字数据类型
ch用%d来打印字符对应的ASCII码,用%c来打印字符。
(三)整型
(四)浮点型
float:%f
double:%lf
(五)强制类型转换
强制数据类型转换(一般是高级转为低级,可能会损失精度)
1、显示转化
2、隐式转换
三、C语言常用命令
1、查看ASCLL码表
man ASCII
2、查看字符长度
3、查看头文件内容
例:vi /usr/include/limits.h
查看不同数据类型表示的范围
使用头文件:
#include<limits.h>
4、常用打印
1)整数:
%d十进制
%x十六进制
%o八进制
%#x:打印以0x开头的十六进制
2)浮点型
%f float
%lf double
3)字符型%c
4)科学计数法%e
5)字符串%s
6)地址%p
5、结束程序运行ctrl+C
6、scanf的用法
scanf("%d",&A);
千万不要有\n!
7、同时打开两段代码
命令:
:vsp 要打开的文件夹
8、查函数手册man +函数
例:man putchar
四、常量-整型、浮点、指数常量
常量是指在程序运行期间数值不发生变化的数据,整型常量就是整数
(一)整数
1、整数在赋值时,只有八进制、十进制和十六进制形式
2、举例
(二)浮点数(实数)
一般含有小数,只有十进制,单精度和双精度,一般形式和指数形式
1、举例
小数由于精度太小,默认为0
(三)字符常量
可以把字符常量看作一个字节的正整数(每一个字符都对应一个ASCII码数值)。
1、常用的字符
2、字符型常量既可以用%c打印字符,也可以用%d打印ASCII对应的正整数
3、大写字母和小写字母相差32,小写=大写+32/‘ ’
4、小写c=‘A’+2+‘ ’
5、字符0-9
6、字符和数字相差48
数字2=字符2-48
(四)字符串常量(有一个隐含字符,以\0结尾)
1、字符串以\0结尾
“A”=‘A’+‘\0’
2、举例
3、字符串数组用char数据类型定义
(五)标识常量
1、宏是原样替代不是运算
如果想要做计算,要加上括号
2、宏定义格式 #define ONE 1(没有;)
3、如果行太长,行尾用\续行
#define ABC jjdiednifhiof\
disnclisa
五、变量
(一)概述
1、变量名由字母、数字、下划线组成
2、不能以数字开头,不能和C的关键字重名
3、在程序运行时,变量所占的内存空间,由变量的数据类型决定
4、变量在内存中的首地址,称为变量的地址
5、变量的一般格式:
存储类型 数据类型 变量名
存储类型是关键词auto(默认)、register、static和extern
六、变量的存储类型
(一)auto变量
只能在某个程序范围内使用,即局部变量,通常在函数体内或函数的复合语句之中。默认是一个随机的值。
1)局部变量,第二个输出报错
2)一般来说auto是省略的
(二)register寄存器型
将变量放入寄存器,这样可以加快程序的运行速度
1)放到处理器内部
2)如果申请不到就使用一般内存,同auto
3)在程序运行时,变量都调入处理器使用,如果频繁访问一个变量,可直接用register定义在处理器内部的寄存器中
4)由于寄存器数量有限,所以将变量放在寄存器可能反而会降低运行速度
5)寄存器存储类型,不能用&来查看地址
(三)全局变量static/extern
1、既可以修饰局部变量,也可以修饰全局变量。既可以在函数体内,也可以在函数体外(默认是0)。
2、static的特点
1)在内存中以固定地址存放,而不是以堆栈的形式存放。
2)只要程序没结束,就不会随着说明它的程序段消失而结束,而且下次调用该函数,该存储类型修饰的变量不在重新说明,而且保留上次存在的值。
3、auto和static区别例子
auto:
一次循环之后,a被销毁
static:
在一次循环后a不会被销毁,即使有命令也不会重新被赋值。
4、extern(全局变量,能被其他文件的程序访问)举例
5、1、2说明static和extern都是修饰全局,区别在于static是根据程序运行而存在,不能在其他文件使用,而extern修饰的全局变量可以在不同文件之间使用。
注意事项
1、可以直接给bool类型的变量赋一个true/false。
2、省略头文件用_Bool定义bool类型,则只能给变量赋数值,不能再赋true/false。
3、ch用%d来打印字符对应的ASCII码,用%c来打印字符。
4、%#x:打印以0x开头的十六进制
5、可以把字符常量看作一个字节的正整数(每一个字符都对应一个ASCII码数值)。
注意要用引号引起来:int a='F';
6、宏是原样替代不是运算
7、寄存器存储类型,不能用&来查看地址
8、再次调用含有static类型的变量的函数,该存储类型修饰的变量不在重新说明,而且保留上次存在的值,在一次循环后a不会被销毁,即使有命令也不会重新被赋值。
9、static和extern都是修饰全局,区别在于static是根据程序运行而存在,不能在其他文件使用,而extern修饰的全局变量可以在不同文件之间使用。