APS-C语言
2022-03-14 11:44:06 5 举报
C语言复习资料 for APS
作者其他创作
大纲/内容
函数
概念
函数是C语言程序的基本单位,由函数名、形参表和函数体组成。分为三类:主函数、库函数和用户自定义函数
组成
函数名
函数类型声明:代表返回值类型,可以是有效类型如int、float,也可以是void无返回值
形参
用以在函数被调用时接受实参,一般进行数值传递(单向传递,分配新内存),当形参为数组或指针时进行地址传递(不分配内存,形参与实参指向同一地址,双向传递)。
形参要定义类型,如实参与形参类型不一致则进行转换,若定义为数组类型且传入类型不一致则报错(但数组大小不一致则没关系)
内存:被调用时才被临时分配内存单元,调用结束后即释放
返回值
无返回值(无return):有一个不确定的值被返回,不建议用,一般无返回值用return;
有返回值用 return 表达式; 或 return (表达式);
类型:返回值类型应与函数类型保持一致,否则以函数类型为准进行数据转换
调用
嵌套:在一个函数内调用另一个函数,一般要先定义或声明函数,在进行调用
递归
直接递归:我调我自己
间接递归:两个函数相互调用
exit(-1); 强制结束调用回到主函数
作用域
局部变量
函数内部定义的变量,作用域为此函数内部或函数某语句范围内。
全局变量
函数外部定义的变量,作用域是从定义点开始到此文件结束,作用域外想要调用需用extern进行声明,如extern float a;
优先级
越局部越优先
变量的存储类别
存储空间分三类
程序区
存放用户程序
静态存储区
存放全局变量(可被外部用extern引用)、静态全局变量(外部无法引用)、静态局部变量。静态变量用static声明,编译时即分配存储单元,只初始化一次(默认初始化为0或空字符),函数调用完并不释放,在程序结束时才释放,如static int a=1。extern用于声明外部变量,声明时不分配内存不产生新变量,不能对变量进行初始化,声明后即可使用,如extern int a;
动态存储区
局部自动变量auto(一般省略):变量类型前什么都不写的话就是auto的,如int a=0;
寄存器(CPU中)
寄存器变量register:register使用上与auto没区别,位置在寄存器,特点就是快,频繁调用用这个,声明方法register int a=0。只有局部auto和形参可以放在寄存器,且类型只能为int、char和指针。
函数的使用范围
内部函数
用static定义的函数即内部函数(静态函数)外部无法调用,static float sum(float a){...}
外部函数
用或省略extern定义的函数都为外部函数,作用域是整个程序的各个文件,调用时需提前用extarn声明
预处理命令
预处理命令
预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作,由预处理程序完成,处理完毕自动进行队员程序的编译。C语言的预处理命令均以"#"开头,结尾不加分号
宏
定义 #define PI 3.1415 终止作用域 #undef 。宏定义允许嵌套比如 #define L 2*PI。宏定义不分配内存
关于宏的预处理叫宏展开:将程序中的宏名替换成对应的字符串,不做计算,不求解表达式,仅作替换。宏展开会使程序变长,只占用编译时间,不占用运行时间
带参宏定义: #define S(a,b,c) c=a+b; a++; b++; 参数不必带类型因为不分配内存
文件包含命令
格式1: #include "文件名"
系统现在本程序文件所在的磁盘和路径下寻找包含文件,若找不到,再按系统一定的路径搜索。为减少出错通常使用此格式
格式2: #include <文件名>
系统仅按规定的路径搜索包含文件:在包含文件目录中查找(包含文件目录是用户在设置环境时配置的)
一个#include命令仅能指定一个文件,包含文件可嵌套
指针
指针是C语言中一种重要的构造类型,是功能最强也是使用起来最复杂的机制。指针机制是程序员可以按地址直接访问存储空间,在权限许可范围内对存储空间中的数据进行任意解释和操作。
指针变量
保存其他变量地址的变量就是指针变量。普通变量变量名对应存储首地址,存储地址中存有变量值,指针变量的存储地址中存的是其他变量的地址
定义指针变量需要说明 1.指针变量的名字 2.指针变量指向的变量的数据类型。如 int *p; 则p为指向整型变量的指针变量
空指针
空指针不指向任何对象,应赋值0,如 int *p=0; 指针初始化为0代表不指向任何对象,指针不初始化,会被分配一个随机值,有可能指向某个未知对象,是野指针
void指针
无类型指针可以指向任意类型,其他类型指针可以直接赋值给void指针,如 void *p; int *q, x=10; q=&x; p=q;
但使用void指针向类型指针赋值时需要强制类型转换,如void *p; int *q, x=10; p=&x; q=(int *)p;
指针运算
&取址运算符,返回其后所跟变量的地址;*指针运算符,取其后所跟指针指向的存储单元的值;int x=10, *p, y; p=&x; y=*p; 则y=10
指针与数组
数组名本身就代表数组存储空间的首地址,因而可以通过指向数组的指针来完成对数组元素的访问。可以通过下标方式、偏移量方式,指针遍历方式实现对数组元素的访问。
指针与函数
将指针作为函数参数是在函数中使用指针的常用方式。通过将指针作为函数参数来解决函数只能返回一个值的局限,这时实参一般是变量的地址或数组名。
也可将指针作为函数的返回类型。这时要求不能将函数体中的局部变量的地址作为返回值。
由于函数名本身就代表指向函数代码段的首地址,因而可以定义指向函数的指针,将函数名赋值给指针,可以通过指针完成函数调用
文件
概述
文件分类
从用户角度分
普通文件:程序文件、数据文件(.exe\.obj\.c等)
设备文件:C系统将所有外部设备都看作文件,如显示器是标准输出文件可用标准输出函数printf/putchar控制输出,再入键盘是标准输入文件,可用scanf/getchar控制输入
以编码角度分:一般文件最基础存储单位是字节(8位二进制),C语言在处理文件时,并不区分类型,都按字节处理,看成字符流,因此也将处理的文件成为“流文件”
ASCII文件:也称文本文件,文件在磁盘中每个字节存放的是对应字符的ASCII码,ASCII码可在屏幕上按字符显示
二进制文件:节省存储空间,但可读性较差
文件指针
C语言中,所有对文件的操作都是通过文件类型指针来进行的,文件类型指针是指向文件结构体变量的指针
文件打开、关闭和读写
stdio.h: fopen 打开文件
stdio.h: fclose 关闭文件,文件打开后必须关闭,否则文件读写的数据可能丢失
stdio.h: fgetc/fputc/fgets/fputs/fprintf/fscanf/fread/fwrite
文件定位
stdio.h: rewind/fseek/ftell/feof
介绍
C语言特点
具有低级语言功能的高级语言:允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。C语言的这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言。
模块化和结构化语言:C语言用函数作为程序模块,以实现程序的模块化
可以移植性好:C语言不包含依赖硬件的输入输出机制,使C语言本身不依赖于硬件操作系统,可移植性好
执行效率高:C语言生成目标代码质量高,程序执行效率高
C程序
组成:由头文件、主函数、系统的库函数和自定义函数组成。其中main主函数是必须要有的
三种基本结构:顺序结构、选择结构、循环结构
C语言算法,具有以下特点
确定性:每一步运算应具有无二异性
又穷性:一个算法在执行有穷步的运算后终止
有效性:算法中的运算都是有效的,x=3/0这种错误无效运算不应存在
C程序运行步骤
1. 编写C语言源程序,生成源文件file.c
2. 编译:将C语言程序编译成机器语言,同时进行语法语义检查,生成目标文件file.obj
3. 连接编辑:把目标文件及系统的库函数进行连接,生成可执行文件file.exe
4. 运行可执行文件file.exe
数据类型
标志符命名
只能由字母、下划线、数字组成,首字符只能是字母或下划线
区分大小写
非关键字
数据类型
基本类型
整型
int 基本型,占2字节(16位),有符号,范围-32768-32767
short/short int 短整型,其他int
long/long int 长整型,4字节(32位),有符号
signed int/short/long 有符号
unsigned int/short/long 无符号,0或正数,只适应于整型
三种进制表示:十进制、八进制(以数字0开头)、十六进制(以0x或0X开头,用0-9及A-F表达,如0x61F)
输出:输出格式采用%d或%ld(长整型)
实型
表示方式:十进制、指数形式(用e表示十次方,如1.23e-2则为1.23的-20次方、-4.56e3则为-4.56的三十次方)
float 单精度型,占4字节(32位),7位有效数字,取值范围是-3.4e-38~3.4e38
double 双精度型,占8字节(64位),16位有效数字,取值范围是-1.7e-308~1.7e308
long double 长双精度型,占16字节(128位),取值范围是-1.2e-4932~1.2e4932
输出:输出格式采用%f(单精度)或%lf(双精度),默认输出6位小数,不足补0,超出四舍五入
字符型
单个字符用单引号,字符串用双引号。C语言中没有字符串类型,所以字符串本质上是字符型数组,且以字符‘\0’结尾
char 字符型,占1字节(8位),可以ASCII码与整型互用,由于整型占2字节,所以当整型变字符时只有低八位参与处理
输出:输出格式采用%c
枚举型 enum
当某些量仅由有限个数据值组成时,通常用枚举类型表示。例:enum weekday {sun, mon, tue, wed, thu, fri, sat}; enum weekday a=tue; 则a的值是2
构造类型
结构体 structure
结构体是我们可以自己定义的构造数据类型,一个结构体中可以包含不同数据类型的成员
链表:每个结构体节点都有一个该结构体类型的指针作为成员,指向下一个节点,从而形成链表,可以动态分配内存
共用体 union
将不同类型的数据组织在一起,共同占用同一段内存的一种构造数据类型,共用体变量所占内存大小取决于其创园中占内存空间最多的成员变量。
指针类型
空类型
数据类型转换
隐式转换:不同类型计算时先转换成同一种类型;且低位数向高位数转换(但float一律先转换成double再计算);赋值时左侧类型转换成右侧类型
强制转换:(类型标志符)(表达式)。如 int a=(int)5.6;
⚠️浮点型转成整型时直接丢掉小数部分,不进行四舍五入
选择结构
If else语句
switch语句
条件运算:表达式a ? 表达式b : 表达式c
循环结构
while
do while
for
数组
声明
int a[10];
数组名a是数组存储区的首地址,即存放数组第一个元素的地址。
初始化
二维数组:int x[2][3]={1,2,3,4,5,6} 或 int x[2][3]={{1,2,3},{4,5,6}} 或 int x[][3]={1,2,3,4,5,6}
字符数组:char str[5]={'H','e','l','l','o'},不足用'\0'补齐
字符串:char str1[6]={'H','e','l','l','o'} 或 char str2[]="Hello" str2的长度为6,字符串末尾有'\0'占一位,若没有'\0'则此数组不能作为字符串处理
输入输出函数
getchar() 输入一个字符;putchar(字符名) 输出一个字符
gets(字符串数组名) 输入字符串;puts(字符串数组名) 输出字符串
scanf("%c", 数组元素地址) 或 scanf("%s",数组名) (数组名就是地址常量)
printf("%c",数组元素) 或 printf("%s",数组名) 注意:输出字符串时遇'\0'结束
0 条评论
下一页