C语言从入门到精通
每天进步一点点,日积月累。
纸上得来终觉浅,绝知此事要躬行。
C 语言概述
- 为什么学习C语言
- C语言的起源和发展
- 第一代语言:机器语言(0000、1111、1101)
- 第二代语言:汇编语言(ADD、AX、BX)
- 第三代高级语言
- 结构化语言:使得它的数据和操作是分离的
- Fortran(用于科学计算)
- Basic(->VB)
- C语言
- Pascal(用于教学)
- 面向对象语言
- Algo simula67
- Ada smallTalk
- C++
- Java(->C#)
速度:C>C++>Java
- C语言的特点
优点:代码量小、速度快、功能强大
windows C内核 C++外包
Unix C
linux C
缺点:危险性高、开发周期长、可移植性不强 - C语言的应用领域
- 系统软件开发
- 操作系统:Windows、Unix、Linux
- 驱动程序:主板、显卡、摄像头驱动
- 数据库:DB2、Oracle、Sql server
- 应用软件开发
- 办公软件
- 图形图像软件
- 嵌入式软件
- 游戏开发
- 模块化程序设计思想
在设计较复杂的程序时,一般采用自顶向下的方法,将问题划分为几个部分,各个部分再进行细化,直到分解为较好解决问题为止。
模块化设计,简单地说就是程序的编写不是一开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系逐步求精的结果是得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。
模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。
利用函数,不仅可以实现程序的模块化,使得程序设计更加简单和直观,从而提高了程序的易读性和可维护性,而且还可以把程序中经常用到的一些计算或操作编写成通用函数,以供随时调用
举例: - C语言编程预备知识
- CPU、内存条、硬盘、显卡、主板、显示器之间的关系
某双击硬盘上存放的文件(视频,音频),单击后操作系统将硬盘上数据调入内存条中,CPU去处理内存条中数据,图像的话通过显卡在显示器显示。 - 程序如何运行起来
文本编译软件上写完程序后,点击编译(Compiler)、链接(Linker)之后Visual C++生成 .exe可执行文件,再点击运行(Built)之后,Visual C++请求OS去调用CPU执行 .exe文件。
编译:由编译程序对用户源程序进行编译,形成若干个目标模块(Object Module)。
链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module)。
装入:由装入程序将装入模块装入内存。 - 编译预处理
- 定义
#开头的是编译预处理指令,它们不是C语言成分,但是C语言离不开它们 - 宏定义
不带参数的宏定义
带参数的宏定义
- 标识符
- 什么是数据类型
- 什么是变量
变量的本质:是内存中一段存储空间,不同类型的变量其存储单元大小不同
定义:值可以改变的量
存储单元里存放的是该变量的值
变量要有变量名,在使用前必须先定义
变量的数据类型:
字符型数据与整型数据之间可以通用,一个字符能用字符的形式输出,也能用整数的形式输出(字符的本质上是代表一个十进制整数)
变量的运算:
总结:
- C语言并无char类型,就是用Int表示char的!char占一个字节,在C语言所有类型中最小。
- 在C语言中,实际上字符型数据在内存中是以二进制形式存放的,并不是真正的把一个字符存进内存里。在对字符型数据进行相加减运算的时候,系统会首先会将char型数据以隐形的方式转化成int型数据再进行相加减运算的。因此,由字符型数据在内存的存储方式来看,字符型数据是可以进行数值运算的,对字符型数据做数字运算实际上就是对字符本身对应的ASCII码进行相应的数值运算。
- “ 整型”和“字符型”可以互相转换:
- 变量为什么必须初始化(赋值)
软件运行期间,软件所占的内存空间不再分配给其他软件,当软件运行完毕后,OS将回收内存空间(OS并不清空该内存空间遗留下的数据) - 如何定义变量
数据类型 变量名=要赋的值
(int price = 10;) - 进制
- 什么叫进制
- 进制转换的预备知识
- 把r进制转换为十进制
- 把十进制转换成r进制
1. 把十进制转换为二进制
2. 把十进制转换为八进制
3. 把十进制转换为十六进制
十进制转r进制方法:除r取余,直至商为0,余数倒叙排列 - 二进制与十六进制转换
- 不同进制所代表的的数值之间的关系
C语言规定八进制前加:0
C语言规定十六进制前加:0X
二进制的101和十进制的5,本质上是一样的,只是外部形式不同。
常用计数制对照表
同一个值不同的进制表示形式不同
- 什么是常量
在程序运行中,其值不能被改变的量。 - 常量在C语言中如何表示
在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上 就可以显示这个字符,即输入什么就显示什么。这类字符称为可显示字符,如a、b、c、$、+和空格符等都是可显示字符。
另一类字符却没有这种特性。它们或者在键盘上找不到对应的一个键(当然可以用特殊方式输入),或者当按键以后不能显示键面上的字符。其实,这类字符是为控制作用而设计的,故称为控制字符。 在C语言中,构成字符常量的控制字符必须用转义字符表示。
通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,下表是常用的转义字符及其含义。
转义字符 | 意义 | ASCII码值(十进制) |
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\|代表一个反斜线字符’ \ ’ | 092 | |
\’ | 代表一个单引号(撇号)字符 | 039 |
\" | 代表一个双引号字符 | 034 |
\0 | 空字符(NULL) | 000 |
\ddd | 1到3位八进制数所代表的任意字符 | 3位八进制 |
\xhh | 1到2位十六进制所代表的任意字符 | 2位十六进制 |
由上可知,使用八进制转义字符和十六进制转义字符,不仅可以表示控制字符,而且也可以表示可显示字符。但由于不同的计算机系统上采用的字符集可能不同,因此,为了能使所编写的程序可以方便地移植到其他的计算机系统上运行,程序中应少用这种形式的转义字符。
- 常量以什么样的二进制代码存储在计算机中
整数以补码的形式转化为二进制代码存储在计算机中的。
实数以IEEE754标准转化为二进制代码存储在计算机中的。
字符的本质实际也是与整数的存储方式相同。 - 代码规范化
推荐阅读《高质量程序设计指南C/C++编修》
让别人和自己更容易可读和理解 - 什么是字节
字节就是存储数据的单位,并且是硬件所能访问的最小单位。
1字节(Byte) = 8位(Bit) - 什么是ASCII码
ASCII不是一个值,而是一种规定。
ASCII规定了不同的字符是使用哪一种整数值去表示。
GB2312和UTF-8规定不同字母用什么数字表示。
运算符和表达式
- C语言运算法简介
- 算术运算符:+,-,*,/,%
- 除法/的运算结果和运算对象的数据类型有关
- 取余%的运算对象:两个操作数必须是整数(int类型),结果是整除后的余数
- 关系运算符:>,<,>=,<=,!=,==
- 位运算符:>>,<<,~,&,|,^
- &——按位与
- |——按位或
- ~——按位取反
- ^——按位异或
- <<——按位左移
- >>——按位右移
位运算符的现实意义:通过位运算符我们可以对数据的操作精确到每一位
- 逻辑运算符:!,||,&&
- C语言对真假处理
- C语言真假判断
- &&逻辑与也叫并且
- 逻辑运算符的结果只能是0或1
- 条件运算符:?:
- 指针运算符:&,*
- 赋值运算符:=
作用:将一个数值赋值给一个变量或将一个变量的值赋给另一个变量。
赋值表达式一般形式:变量名=表达式/变量/值
复合赋值表达式:+=、-=、*=、/=、%=
- 逗号运算符:,
- 字节运算符:sizeof
- 强制运算符:(类型名)(表达式)
- 初等运算符:圆括号(),下标运算符[ ],结构体成员运算符->
- 单目、双目、三目运算符
- 自增、自减运算符
例子:
- 运算符的优先级和结合性
优先级:初等>单目>算术>关系>逻辑>条件>赋值>逗号
结合性:左结合性->单目,条件,赋值,扩展;其余右结合性
- 图示运算符优先级和结合性
最高级:出现同级别运算符时的结合方向是从左往右
第二级:这一级都是单目运算符号,这一级的结合方向是从右向左。
出现 * p++,这时 * 和++同级别,先算右边,再左边。所以 * p++等价于 * (p++)
第三级:这一级都是算术运算符,结合顺序和数学学习中一致的,先乘除取余数,后加减。
第四级:这是左移、右移运算符,位运算时可能需要用到。
第六级:这三个符号也是位运算符号,其中内优先级,&>^>|。
第七级:逻辑与&&优先级大于逻辑或||。
第八级:也称为条件运算符号,是C语言中唯一的一个三目运算符,结合顺序是从右往左。
第九级:这些运算符也叫做赋值运算符,除此之外,>>=、<<=、&=、^=、|=这些赋值运算符也在这一级别内,结合顺序是从右往左。
最低级:逗号运算符也称为顺序求值运算符,在C语言中,运算级别最低。
- 表达式
C语言一些琐碎的知识
- 浮点数的存储所带来的的问题
float和double都不能保证可以精确的存储一个小数。
为什么循环中更新的变量不能定义为浮点型呢
- 二进制全部为0的含义——0000000…00000的含义
- 表示数值零
- 表示字符串结束标记 ‘\0’
- 空指针NULL
- 0地址
- 什么叫分配内存,什么叫释放内存
分配内存:
释放内存:
- 变量为什么必须得初始化
不初始化,则变量通常就是垃圾值