一. 概述
1.1 C语言的发展过程
1. C语言与1983年发表,通常称之为ANSIC。
1.2 C语言的特点
1. C语言可以访问物理地址,可以进行位操作运算,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
2. C语言高效,紧凑,灵活,底层控制力强。
3. 语法限制不太严格,程度自由度大。
1.3 程序设计思想
1. 面向过程 :对问题的过程进行面对,是解决问题所需要的步骤,用函数把步骤一步一步实现,使用时依次调用。
2. 面向对 :以一种实物为中心的编程思想。
1.3 运行第一个代码
二.数据类型、变量、常量、和运算符
1.数据类型
1.基本类型:
1.1 整型:int、short、long、long long
1.2字符型: char
1.3 浮点型:float、double
1.4 枚举型 : enum
2.构造类型
1.数组、结构体struct、共用体union
3.指针类型
4.空类型 void
2.基本数据类型
1.逻辑类型
1.只有两个量,true表示真、false表示假。
2.整数类型
1..char 长度为一个字节 ,值域为-128~127(有符号)或0~255(无符号)
计算机在内存储蓄中是以补码进行存储的
原码:符号位加上真值的绝对值
反码:符号位不变,其他位取反
补码:在反码的基础上+1
ASCII码表
2.short 长度为2个字节,值域为-32768~32767(有符号)或 0~65535(无符号)
3.int 长度为4个字节,值域为 -2147483648~2147483647(有符号)或 0~4294967295(无符号)
3.long
4.浮点类型
1.float 长度为4个字节,值域大小为~1.2e-38 到 3.4e+38
2.double 长度为8个字节,值域大小为~2.2e-308 到 1.8e+308
5.bool类型
bool 值域只有零(false)和 非零(true)
三、常量
1.整型常量
常量是在程序运行期间数值不变的数据;整型常量通常为整数
整数可以是十进制,十六进制,八进制
2.浮点常量
浮点常量又被称为实数,一般含有小数部分。
在C语言中,只有十进制的实数,分为单精度(short)和双精度(double)
3.指数常量
指数形式的实数一般由尾数部分、字母e/E组成。
指数常量通常用来表示特别大或者特别小的数
4.字符常量
字符常量通常是单一的字符,由’ ‘表示,如’A‘、'a'、'0'、'?'都是字符常量
字符常量具有数值,字符常量的值等于字符的ASCII值。
5.字符串常量
字符串常量是用双引号括起来的一串字符来表示的数据(字符串以'\0'结尾)
6.标常识量
标识常量就是标识符代替常量使用的一种常量,其名称通常是一个标识符。
在使用之前必须先定义,说明。形式为:宏
四、变量
1.变量的基础
1.变量名称可以在规则内任意命名
2.变量名称由数字、字母、下划线组成,数字不能开头
3.变量的大小由其数据类型来决定
4.变量在内存中的首地址,称为变量的地址
2.变量的说明
变量在使用时,必须预先说明它的存储类型和数据类型
1.说明的一般形式:
<存储类型> <数据类型> <变量名>
1.1<存储类型>的关键词是auto、register、static、extern
1.2<数据类型>可以是基本数据类型,也可以是自定义的数据类型
3.变量的存储类型
1. auto
说明变量只在某个程序范围内使用,在函数体或函数的符合语句中(默认是随机数)
2.register
称为寄存器类型,不能用&去取地址
register的变量必须是一个单个值,并且大小要小于或等于整型的长度
3.static
static变量称为静态存储类型的变量,既可以在函数体内也可以在函数体外说明情况
static表示全局变量的情况下,只能在本文件中使用,其他文件无法使用
4.extern
当变量在一个文件中的函数体外说明,所以其他文件中的函数或程序段都可以引用这个变量
五.运算符
1.算数运算符
C语言提供的算数运算符:+、-、*、/、%、++、--(浮点类型不能取余)
2.关系运算符
C语言的关系运算符:> 、>=、<、<=、==、!=
3.逻辑运算符
!逻辑反 &&逻辑与 ||逻辑或
4.位运算
C语言的位运算符:~位逻辑反、&位逻辑与、| 位逻辑或、^位逻辑异或、>>右移动、<<左移动
&运算符运算规律:都为1则为1。
|运算符运算规则:有1则为1。
^运算符运算规则:相同为0,不同为1。
5.赋值运算符
C语言的赋值复合运算符:+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=
6.特殊运算符
1.三目运算符:<表达式1>?<表达式2>:<表达式3>
如果表达式1成立则执行表达式2,否则执行表达式3
2.逗号运算符
3.sizeof运算符
运算符的一般形式:sizeof(类型或变量名)
4.C运算符的优先级
六、输入输出
1.数据输出
1.C语言无I/O语句,I/O操作由函数实现#include <stdio.h>
2.字符输出函数格式:putchar(c)、参数:c为字符常量,变量或者表达式、功能:把字符c输出到显示器中、返回值:正常,为显示的代码值
2.格式输出函数
格式:printf("格式控制符",输出表);
3.字符输入函数
字符输入函数getchar格式:getchar()
功能:从键盘一字符返回值:正常,
返回读取的代码值;出错或结束返回-1
4.格式输入函数
格式:scanf(”格式控制串“,地址表)
5.输入函数垃圾清理
1.用getchar清理
2.用格式符串空格或%*c来吃掉
6.字符串输入输出函数
1.字符串输入函数gets
2字符串输出函数put
七.控制语句
1.if-else语句
if(表达式)
语句块1
else
语句块2
2.switch语句
switch(表达式){
case 常量表达式1:语句块1; break;
default :语句块n+1
}
3.循环语
1.goto
1.当程序有多个出口,使用goto把这些出口集中到一处很方便,特别是函数中有很多重复的工作的时候。
2.while
while语句构成循环
循环条件:1.变量初值 2.终止条件 3.变量变化
3.do-while
do{
statements;
}while(表达式);
4.for
for(expression1;expressiojn2;expression3)
{ statements;
}
4.辅助控制语句
1.break
用于从循环体内跳出一层循环体,提前结束循环
*break只能用在循环语句和switch语句中
2.continue
结束本次循环,接着判定下一次是否执行循环
注意break和continue的区别
continue直结束本次循环,而break终止本层循环
3.return
return语句的一般形式:return(<表达式>)
主要用于终止包含它的函数的执行
若终止的为主函数,则主程序结束
八、数组
1.一维数组
1.一维数组的定义
1.所谓一维数组是指只有一个下标的数组,它在计算机的内存中是连续存储的。
2. C语言中,一维数组的说明一般形式如下:
<存储类型><数据类型><数组名>[<表达式>];
2.一维数组的引用
数组必须先定义,再使用
只能逐个引用数组元素,不能一次引用整个数组
数组元素表示形式:数组名[下标]
其中,下标可以是常量或者整形表达式
3.一维数组的初始化
1.初始化方式:在定义数组的时候,为数组元素赋初值
inta[5] = {1,2,3,4,5};
2.说明
1.数组不初始化,其元素值为随机数
2.对static数组元素不赋初值,系统会自动赋以0
3.只给部分数组元素赋初值
2.二维数组
1.二维数组的定义
定义方式:(声明时列数不能省略,行数可以)
元素个数=行数*列数
2.二维数组的存放顺序
原因:内存是一维的
二维数组:按行序优先
3.二维数组的引用
形式:数组名[下标][下标]
二维数组元素的初始化
1.分行初始化
2.按元素排列顺序初始化
3.多维数据
具有两个或者两个以上下标的数组称为多维数组。
九、字符数组和字符串
1.字符数组
1.字符数组是元素的数据类型为字符类型的数组
2.字符串数组
1.C语言中没有字符串常量,用字符数组处理字符串,字符串结束表示:‘\0’
3.字符串函数
1. strlen ,求字符串长度函数
2. strcpy,字符串拷贝函数
3. strcat,字符串连接函数
4. strcmp,字符串比较函数
1.strlen函数
字符串长度函数strlen
格式:strlen(字符数组)
功能:计算字符串长度
返回值:返回字符串实际长度,不包括'\0'在内
2.strcpy函数
字符串拷贝函数strcpy
格式:strcpy(字符串1,字符串2);
功能:将字符串2拷贝到字符串1中
返回值:返回字符数组1的首地址
说明:1.字符数组1必须足够大。 2.拷贝时'\0'也拷贝。
3.strcat函数
字符串连接函数strcat
格式:stracat(字符数组1,字符数组2)
功能:把字符数组2连接到字符数组1后面
返回值:返回字符数组1的首地址
说明:1.字符数组1必须足够大。 2.连接前,两串均以'\0'结束,连接后,串1的'\0'取消,新串最后加‘\0’
4.strcmp函数
字符串比较函数strcmp
格式:strcmp(字符串1,字符串2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII),直到遇到不同字符或'\0'为止
返回值:返回int型整数
1.若字符串1<字符串2,返回负整数
2.若字符串1>字符串2,返回正整数
3.若字符串1=字符串2,返回零
十、指针
1.指针的基本用法
1.C语言中使用指针可以程序简洁,紧凑,高效
2.有效的表达复杂的数据结构
3.动态分配内存
4.得到多余一个的函数返回值
2.指针的概念
在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,有时对地址,指针和指针变量不区分,统称指针。(地址==指针)
3.指针的含义
指针指向的内存区域中的数据称为指针的目标
如果它指向的区域是程序的一个变量的内存空间,则这个变量称为指针的目标变量,简称为指针的目标。
引入指针要注意程序中的px、*px和&px三种表示方法的不同意义,设px为一个指针,则:
px ,指针变量,它的内容是地址量
*px,指针所指向的对象,它的内容是数据
&px,指针变量占用的存储区域的地址,是一个常量
4.指针运算
1.指针运算是以指针变量所存放的地址量作为运算量而进行的运算
2.指针运算的实质就是地址的计算
3.指针运算的种类是有限的,它只能进行赋值运算、算数运算和关系运算。
4.指针算术运算表
注意:不同数据类型的两个指针实行加减法整数运算是没有意义的
5.指针和数组
1.在C语言中,数组的指针是指数组在内存中的起始地址,数组元素的地址是指数组元素在内存中的起始地址。
2.一维数组的数组名为一维数组的指针(起始地址)
注意:
1.指针变量和数组在访问数组中元素时,一定条件下其使用方法具有相同的形式,因为指针变量和数组名都是地址量
2.但指针变量和数组的指针(或叫数组名)在本质上不同,指针变量是地址变量,而数组的指针是地址常量
6.指针和二维数组
1.多维数组就是具有两个或两个以上下标的数组在C语言中,二维数组的元素连续存储,按行优先存
2.可以把二维数组看作由多个一维数组组成。
比如ina a[3][3] ,含有三个元素,a[0],a[1],a[2]
元素a[0],a[1],a[2]都是一维数组名
二维数组名代表数组的起始地址,数组名加1,是移动一行元素。因此,二维数组名常被称为行地址。
7.字符指针和字符串
1.C语言通过使用字符数组来处理字符串
2.通常,我们把char数据类型的指针变量称为字符指针变量。字符指针变量与字符有着密切关系,他也被用来处理字符串。
3.初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中。
4.在C语言编程中,当一个字符指针指向一个字符串常量时,不能修改指针指向的对象的值。
8.指针数组
所谓指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合
指针数组的一般说明形式:
<存储类型> <数据类型>*<指针数组名> [<大小>]
指针数组名表示该指针数组的起始地址
9.多级指针
1.多级指针的定义把一个指向指针变量的指针变量,称为指针变量
2.对于指向处理数据的指针变量称为一级指针变量,简称一级指针。
3.而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。
4.二级指针变量的说明形式如下:
<存储类型> <数据类型>**<指针名>;
10. void指针
1.void指针是一种不确定数据类型的指针变量,它可以通过强转类型转换让该变量指向任何数据类型的变量
2.一般形式为:void*<指针变量名称>;
3.对于void指针,在没有强制转换类型之前,不能进行任何指针的算术运算。
11.const修饰指针
1.const的一般形式如下:
const <数据类型> 变量名 =[<表达式>];
常量化变量是为了使得变量的值不能修改
变量有const修饰时,若想用指针间接访问变量,指针也要有const修饰。
2.常量化指针目标表达式一般说明形式如下
const<数据类型>*<指针变量名称> [=<指针运算表达式>];
常量化指针目标限制通过指针改变其目标的数值
但是指针变量存储的地址可以修改
3.常量化指针变量及其目标表达式一般说明形式如下:
const<数据类型>*const<指针变量名>=<指针运算表达式>
常量化指针目标是限制通过指针改变其目标的数值
但是<指针变量>存储的地址值可以修改
4.常量化指针变量一般说明形式:
<数据类型>*const<指针变量名称> [<指针运算表达式>]
使得<指针变量>存储的地址值不能修改。
但可以通过*<指针变量名称>可以修改所指向变量的数值。
十一、函数
1.函数的基本用法
1.函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值
一般形式如下:
<数据类型><函数名称> (<形式参数>)
{语句序列;
return[(<表达式>)];
}
2.数据类型:是整个函数的返回值类型
3.return语句中表达式的值要和函数的数据类型一致,如无返回值应写为void
4.形式参数说明是逗号”,“分隔的多个变量的说明形式
5.大括弧对语句序列,称为函数体,是大于等于零个语句构成的。
6.函数的说明就是指函数原型。
7.其中,形式参数说明可以缺省说明的变量名称,但是类型不能缺省
8.函数的使用也叫做函数的调用,形式如下:
函数名称(<实际参数>)
实参就是在使用函数时,调用函数传递给被调函数的数据。需要确切的数据
函数调用可以作为一个运算量出现在表达式中,也可以单独形成一个语句,对于无返回值的函数来讲
只能形成一个函数调用语句
2.函数的参数传递
1.函数之间的参数传递方式:
全局变量
复制传递的方式
地址传递的方式
2.全局变量
全局变量就是在函数体外说明的变量,它在程序中的每个函数里都是可见的。
全局变量一经定义后就会在程序的任何地方可见。函数调用的位置不同程序的执行结果可能会受到影响,不建议使用。
3.复制传递方式
1.调用函数将实参传递给被调用函数,被调用函数将创建同类型的形参并用实参初始化。
形参是新开辟的存储空间,因此在函数中改变形参的值,不会影响到实参。
2.地址传递方式
按地址传递,实参为变量的,而形参为同类型的指针
3.数组在函数中的传参
全局数组传递的方式
复制传递方式
实参为数组的指针,形参为数组名(本质上是一个指针变量)地址传递方式
实参为数组的指针,形参为同类型的指针变量。
4.指针函数
1.指针函数是指一个函数的返回值为地址量的函数
2.指针函数的定义的一般形式如下:
<数据类型>*<函数名称> (<参数说明>)
{
语句序列;
}
5.递归函数
1.递归函数是指一个函数的函数体中直接或间接调用了该函数自身。
2.递归函数调用的执行过程分为两个阶段:
递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归的终止条件
回归阶段:按递归终止条件求出结果,并逐步代入递归公式,回归到原问题求解
6.函数指针
1.函数指针用来存放函数的地址,这个地址是一个函数的入口地址
2.函数名代表了函数的入口地址
3.函数指针变量说明的一般形式如下:
<数据类型> (*<函数指针名称>)(<参数说明列表>);
7.函数指针数组
1.函数指针数组是一个保持若干个函数名的数组
2.一般形式:
<数据类型> (*<函数指针数组名称>)(<大小>)(<参数说明列表>);
3.大小,是指函数指针数组元素个数
4.其他同普通的函数指针