什么是计算机程序
用途特点
语言紧凑灵活使用方便
只有37个关键字
int
float
double
char
short
long
signet
unsignet
struct
union
enum
for
if
else
goto
while
do....while
break
continue
switch
case
default
return
auto
extern
register
static
<font color="#31a8e0"><b>C语言组成部分</b></font>
由一个或多个函数组成
<font color="#f15a23">只有一个main函数</font>
被调函数可以是库函数也可以是自己写的函数
每个函数都用来实现特定功能
一个函数包含
函数首部
函数体(<b><font color="#f15a23">可以是空函数</font></b>)
声明部分
执行部分
从main函数开始执行
数据申明与语句后必须要有分号
C语言本身不提供输入输出语句
过程:<font color="#f15a23"><b>.c-编译-.obj-链接-.exe</b></font>
算法
算法+数据结构=程序
<font color="#55beed" style=""><u style=""><b>算法特征</b></u></font>
有穷性
确定性
有零个或多个输入
有一个或多个输出
有效性
数据类型,常量,变量,运算符及表达式
<b><i><font color="#31a8e0">格式字符</font></i></b>
用scanf输入数据
取址符&不能忘
最大限度识别数
\转义字符
\a 警告
\b 退格
\f 换页
\n 换行
\r 回车,回到文章开头
\t 水平制表符
\v 垂直制表符
\o \xh 与8进制,16进制对应的ascii码
<b><font color="#55beed">常量与变量</font></b>
变量
数字字母下划线,数字不能放首位,负数是正数的反码加一
注
变量必须先定义后使用
定义时指定该变量的名字和数据类型
变量名和变量名的值不相同
从变量中取值实际是从变量名找到相应的地址从该存储单元中读取数据
变量值一定在存储单元中
常变量
在定义变量前,前面加上一个关键字const
区分
常变量与常量之间的区别:常变量更容易引用
常变量与符号常量的区别:符号常量是预编译的预编译后符号常量就不见了,常变量有变量值占存储单元只是值不改变
<b><font color="#55beed">数据类型(重点)</font></b>
ASCII码:字母A-Z 65-90 ,a-z 97-122,数字0-9 48-57,空格 32
’\0‘,null,\0都有终止的意思
C语言实型常量都是双精度浮点型常量
运算符优先级(从上到下)
算数运算符,关系运算符,逻辑运算符,赋值运算符,逗号运算符
[]
()
.
-->
-
子主题
-->
-
++
--
*
&
!
~
/
*乘
%
+
-
<<
>>
>
>=
<
<=
==
!=
位运算&
位运算|
位运算^
&&
||
? :
<b><font color="#55beed">C语句:C语言本身不提供输入输出语句</font></b>
控制语句
if .....else
for
while
do......while
continue
break
switch
return
goto
三种基本控制结构
<b><font color="#55beed">while</font></b>
<font color="#f15a23">while(表达式)语句</font>
循环次数(终止值-初值)÷步长+1
<b><font color="#55beed">do......while</font></b>
<font color="#f15a23">do 语句 while(表达式);</font>
分号不能省略,先计算后执行
<b><font color="#55beed">for</font></b>
<font color="#f15a23">for(表达式1;表达式2;表达式3) 语句;</font>
表达式1,2,3都可以省略,分号不可以丢;表达式1只执行一次,表达式2是循环的表达式,表达式3作为循环的调整
更加灵活
注意
循环体内又包含一个循环称为循环嵌套
内嵌中还可以嵌套,就是多层循环
3种循环可以相互嵌套
三种循环可以互相替换
while与do......while初始化应在之前完成
for语句初始化在表达式1中进行
都可以用break跳出循环
break与continue
区别
break跳出全部循环执行下一条语句
continue跳出当前一次循环执行下一次循环
break语句只能用于循环语句与switch中
附加
fabs()求绝对值函数
sqrt()求根号函数
函数
常用库函数
sin
cos
pow(n,k)n的k次方
sqrt根号
exp指数
fabs
log对数函数
函数声明以及调用
先定义,后使用
指定函数的名字,按名调用
指定函数的类型,就是函数返回值类型
指定函数参数的名字和类型,以便传输数据
定义函数的方法
无参函数:函数名(void){函数体}
有参函数:函数名(形参表列){函数体}
空函数:函数名(){}
便于结构体的扩充
对程序影响较小
调用
注意
无参函数可以无实参列表
包含多个实参,则各参数间用逗号隔开
<b>函数调用语句</b> 把函数单独作为一个语句
<b>函数表达式 </b> 函数调用出现在另一个表达式中
<b>函数参数</b> 函数调用出现在另一个函数调用时的实参
调用时的数据传递
实参:主调函数 形参:被调函数
注意
形参不占用内存单元,有值后才占有
数据类型不能省略
单向传递,由实参传递给形参
调用过程
注意
实参仍有值
一个return语句只返回一个值,一个函数可以有多个return语句
空类型void ,不需要返回值类型
<b><font color="#c41230">嵌套调用的过程</font></b>
main函数--->调用a函数--->a函数调用b函数--->b函数调用a函数——>直到不满足条件结束
可以无穷无尽
声明
定义形声明需要建立存储空间
引用型声明不需要建立存储空间
值传递与地址传递
带回方式:直接输出和return带回;实参和形参个数相同且一一对应
地址传递
数组名做参数
实参与形参对应同一存储单元
可以不带下标[]
局部变量与全局变量的不同生存周期
函数局部变量
在函数开头定义;在函数内复合语句内定义
形参也可以是局部变量
不同函数中可以使用同名变量,代表不同对象,互不干扰
分程序与程序块表示一个函数的复合语句
先引用内部再引用外部
全局变量
在函数外定义变量;从定义变量开始到本源文件结束
作用范围:整个程序
定义的变量无返回值
全局变量是静态变量
生存周期比局部变量长
不同存储类型的变量
静态存储
由系统分配固定的存储空间方式
无定义时:定义为0
动态存储
在程序运行期间根据需要进行动态存储分配
存放
函数形参
函数定义没有用static声明的
函数调用时现场保护和返回地址
动态存储变量大多是局部变量
用完即释放
无定义时:定义随机
auto,static,register,extern
auto:默认动态存储,除非刻意声明为static,可以省略
static:调用后不消失而是继续保留原值,在静态存储区分配存储单元,只要赋一个初值其他函数不能引用
register:效率高
extern:对该变量进行外部函数声明,可以跨函数也可以跨文件
数组
一维数组
定义
一组有序的数据结合
每一个元素都属于同一个数据类型
一般形式:<b><font color="#f15a23">类型符 数组名[常量表达式]</font></b>
常量表达式不能赋值
一维数组
初始化及引用
全赋值法
不足下标的值后面自动补0
全赋值法可以省略下标
全赋值法后面的0可以省略,首位的0不能省略
若为字符型数组初始化为'\0',若为指针数组初始化为NULL
二维数组
全赋值法
每行用大括号间隔,一个大括号代表一行
也可以不用大括号间隔
部分赋值法
一个一个大括号代表一行,空缺位置自动补0
左边的0不可以省略,右边的0才可以省略
系统可以根据列来推行
某行的元素也可以全省,但必须要有大括号才行
字符数组
单引号不能省
初始化
空格也要赋值
全赋值法:把每个元素依次赋值
部分赋值法:初值个数小于数组长度,后面的元素自动定为'\0'
二维
字符及字符串的存储
字符结束不要用'\0',字符串结束要用
字符串初始化可以省略花括号
输入输出
%c逐个输出
%s一次性输出
getchar(),putchar()输入输出一个字符
gets(),puts()输入输出多个字符
用scanf输入要注意,碰到空格 就跳出,一般不用scanf输入
字符串处理函数
puts
在字符串结束后把'\0'变成'\n'换行
strcat
将后一个字符链接到前一个字符后面结尾要加\0
strcpy
将后面一个字符复制到1中后面结尾加\0
strcmp
比较字符串大小:按照ASCII码规则比较
a==b:返回0
a>b:返回正值
a<b:返回负值
在使用以上函数时记得在开头添加#include <string.h>
指针
地址和指针变量的概念
通过地址能找到所需的变量单元,地址指向该变量单元
指针通过地址来体现的
指针变量的值就是地址(即指针)
指针变量就是地址变量
指针变量
要有初值,若无值则为野指针
定义是*为指针型,使用时*为取回地址
*&可以约掉
<b><font color="#fdb813">用指针变量在做函数参数时,函数调用结束后这些值依然被保存下来,用函数改变要用地址传递</font></b>
数组的指针和指向数组元素的指针变量
引用
下标法直接取值,指针法间接取值
两指针相减表示相对位置
数组名永远是首地址动态
形参和实参并不要求全是数组名
多维数组元素的地址
注意分清地址和元素
行指针(*p)[m]指向由m个元素组成的的一维数组的指针
字符串的指针和指向字符串的指针变量
用字符指针变量指向一个字符串常量通过字符指针变量应用字符串常量
可以对字符指针赋值,不可以对数组名赋值
指针可以等价,数组不能等价
数组只能定义时初始化
位运算
>> <<
左移相当于乘以2的n次方,右移相当于除以2的n次方