C 语言复习笔记本文为作者准备东北林业大学计算机技术复试时整理的C语言笔记,参考了其复试大纲,故很多内容可能不全或者不适合其他用途,请读者分辨文章目录C 语言复习笔记C 语言概述C 语言及其特点C 语言程序结构C 语言程序的开发步骤数据C 语言数据:常量、变量和标识符及常用基本数据量C 语言常用运算符和表达式不同类型数据之间的转换顺序结构程序设计C 程序设计概述数据的输出数据的输入C 语言顺序结构程序设计方法选择结构和循环结构程序设计实现选择结构的控制语句及程序设计方法1. `if` 语句2. `switch` 语句实现循环结构的控制语句及程序设计方法1. `while` 循环2. `do-while` 循环3. `for` 循环4. 循环控制:`break` 和 `continue`选择、循环的嵌套及较复杂选择、循环程序设计数组一维数组定义及使用二维数组定义及使用字符数组定义及使用,常用字符串处理函数函数函数定义和函数声明简单变量及数组作为函数参数函数的嵌套调用和递归调用变量的存储属性多文件编译编译预处理方法指针指针概述指针与数组指针与函数结构体、共用体和枚举类型结构体类型变量定义和引用结构体与数组结构体与指针动态存储分配和链表共用体及枚举类型数据用 typedef 定义类型位运算位运算符位运算应用文件文件概述文件的打开与关闭文件的读写文件的定位C 语言概述C 语言及其特点C语言是一种面向过程的计算机编程语言,属于高级语言,但兼具底层操作能力。其核心特点包括:语言简洁紧凑,使用灵活;数据类型丰富(基本类型、构造类型、指针类型等);运算符多样(算术、逻辑、位、赋值等),表达能力强;支持直接内存访问(指针操作),适合系统级编程;代码执行效率高,接近汇编语言;可移植性好,程序可在不同平台间轻松迁移;支持结构化编程,通过函数实现模块化;允许递归调用;具有预处理功能,增强代码的灵活性和可维护性。(AI生成:C语言的特点还包括生成的目标代码质量高,程序执行效率高,且是许多操作系统和嵌入式系统的首选语言。此外,C语言对大小写敏感,且允许直接操作硬件。)C 语言程序结构C语言程序的基本结构通常包含以下部分:预处理器指令(如#include、#define,用于引入头文件和宏定义);函数(程序功能的基本单元,其中main函数是程序执行的入口);变量(包括全局变量、局部变量和静态变量,用于存储数据);语句与表达式(实现算法逻辑,如赋值、循环、条件判断等);注释(用于解释代码,提高可读性,支持单行//和多行/* */注释)。此外,程序还可以包含数据类型声明、函数原型等元素。下面是一个最简单的C程序示例,展示了基本结构:#includestdio.h// 预处理指令:包含标准输入输出头文件intmain(){// 主函数,程序入口printf("Hello, World!\n");// 输出语句return0;// 返回语句,0表示正常结束}// 输出:Hello, World!(AI生成:上述示例包含了预处理指令、函数、语句和注释,展示了C程序的基本骨架。)C 语言程序的开发步骤C语言程序的开发遵循典型步骤:编写代码:使用文本编辑器创建源代码文件,扩展名为.c。预处理:预处理器处理以#开头的指令,如头文件展开、宏替换、条件编译。编译:编译器将预处理后的代码转换为汇编语言或目标代码,生成.obj或.o文件。链接:链接器将多个目标文件与库文件合并,生成可执行文件。执行:运行生成的可执行程序,验证结果。实际开发中,还可能包括调试、优化和测试等环节。以下内容来源于C Primer Plus:使用C语言的7个步骤:定义程序的目标、设计程序、编写代码、编译、运行程序、测试和调试程序、维护和修改代码。(AI生成:开发步骤中的预处理、编译、链接可以合并使用gcc命令一步完成,例如gcc hello.c -o hello。开发环境如Visual Studio、Code::Blocks等通常集成了这些步骤。)数据C 语言数据:常量、变量和标识符及常用基本数据量C语言程序处理的数据有常量和变量两种形式。常量:在程序中不能改变其值的量,按类型分为:整型常量:-10,10,0实型常量:3.14,-0.56,18.0字符型常量:'a','A'字符串字面量:"Hello, World!"特别需要注意的是符号常量,常用#define指定某个符号代表一个常量,但它不占内存(预处理时进行文本替换)。#definePI3.14159// 定义符号常量PI,之后代码中PI均被替换为3.14159变量:值在程序执行过程中可以改变的量。定义格式:类型 变量名[= 初始值];,例如int x = 10;。系统会为变量分配存储空间。标识符是程序用来命名变量、函数、数组、结构体等的字符序列,命名遵循以下规则:仅支持字母(a-z, A-Z)、数字(0-9)、下划线(_);必须以字母或下划线开头;不能是关键字(如int、if、return);区分大小写。基本数据类型(在不同平台上可能大小不同,以下为常见32位系统):整型:int(4字节)、short(2字节)、long(4或8字节)、long long(8字节)。字符型:char(1字节),可表示字符、ASCII码等。浮点型:float(4字节)、double(8字节)、long double(10字节或更多)。其他类型:布尔类型_Bool(C99)、结构体struct、联合体union、枚举enum、空类型void、指针类型*等。(AI生成:C语言中,可以通过sizeof运算符获取类型或变量在当前平台下的字节数,例如sizeof(int)。另外,char类型本质上是小整数,可参与数值运算。)C 语言常用运算符和表达式C语言运算符相当丰富,按功能可以分为以下几类。算术运算符:用于基本的数学运算,操作数一般为数值型。运算符描述实例+加法x + y-减法x - y*乘法x * y/除法x / y(整数除法与浮点除法需注意:若两边均为整数,结果取整)%取模x % y(仅适用于整数)关系运算符:比较两个量的大小关系,结果为逻辑值(真为 1,假为 0)。运算符描述实例==等于x == y!=不等于x != y大于x y小于x y=大于等于x = y=小于等于x = y逻辑运算符:组合多个条件,支持短路求值(一旦确定整个表达式的值立即停止运算)。运算符描述实例逻辑与x y||逻辑或x || y!逻辑非!x赋值运算符:用于将值赋给变量,可与其他运算符结合形成复合赋值运算符。运算符描述实例=简单赋值x = y+=加法赋值x += y等价于x = x + y-=减法赋值x -= y等价于x = x - y*=乘法赋值x *= y等价于x = x * y/=除法赋值x /= y等价于x = x / y%=取模赋值x %= y等价于x = x % y条件运算符(三目运算符):格式为条件 ? 表达式1 : 表达式2,如果条件为真,执行表达式1,否则执行表达式2。逗号运算符:将多个表达式串联,顺序执行,整个表达式的值为最后一个表达式的值,优先级最低。sizeof 运算符:计算数据类型或变量所占内存字节数,结果是size_t类型(无符号整数)。格式:sizeof(类型)或sizeof 变量。指针运算符::取地址,获取变量的内存地址。*:间接寻址,访问指针所指向的变量。其他运算符:下标运算符[]、成员运算符.和-、类型转换运算符(类型)、自增自减++、--等。运算符优先级:运算符按优先级计算,括号可以改变优先级。常见优先级规则:单目 算术 关系 逻辑 赋值 逗号。具体可查阅表格(重点记忆:优先级高于||,但两者都低于关系运算符)。表达式是由运算符和操作数组成的合法序列,每个表达式都有一个值和类型。例如3 + 5 * 2的值是13,类型为整型。不同类型数据之间的转换隐式转换:自动进行的类型转换,规则是向长度更长、精度更高的类型转换,以保持数据准确性。例如:整型提升:char、short参与运算时自动提升为int。算术转换:如果操作数类型不同,系统按long doubledoublefloatunsigned long longlong longunsigned intint的层次自动转换。(AI生成)强制类型转换:用(类型名) 表达式显式指定转换后的类型。例如:inta=5,b=2;floatc=(float)a/b;// 将 a 转换为 float,结果为 2.5(AI生成:强制转换不会改变变量本身的类型,只影响表达式的结果。)顺序结构程序设计C 程序设计概述把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。一个C程序可以由多个函数组成,但有且只有一个主函数main(),它是程序的入口点。程序从main函数的第一条语句开始执行,顺序执行到main函数的结束。顺序结构:程序按照代码书写的先后顺序从上到下依次执行,每条语句执行一次,无分支、无循环。数据的输出C语言本身没有输入输出语句,其输入输出功能通过标准库函数实现。最常用的输出函数是printf(),用于向标准输出设备(通常是屏幕)打印格式化的数据。printf("格式控制字符串",输出项列表);格式控制字符串:包含普通字符(原样输出)和格式说明符(以%开头,指定输出格式)。格式说明符:格式符说明示例输出结果%d输出带符号十进制整数printf("%d", 100);100%u输出无符号十进制整数printf("%u", 100U);100%o输出无符号八进制整数(无前导 0)printf("%o", 100);144%x输出无符号十六进制整数(小写)printf("%x", 100);64%X输出无符号十六进制整数(大写)printf("%X", 100);64%f输出十进制浮点数(float/double)printf("%f", 3.14);3.140000%e以指数形式输出浮点数(小写 e)printf("%e", 3.14);3.140000e+00%E以指数形式输出浮点数(大写 E)printf("%E", 3.14);3.140000E+00%g自动选择%f或%e中较短的格式printf("%g", 3.14);3.14%c输出单个字符printf("%c", 'A');A%s输出字符串printf("%s", "hello");hello%p输出指针(地址)printf("%p", a);0x...(具体地址)%%输出一个百分号%printf("%%");%格式修饰符:可在%和格式符之间添加修饰符,控制宽度、精度、对齐等。例如:%5d:输出宽度为5,右对齐,不足补空格。%05d:宽度5,不足左边补0。%-5d:左对齐。%.2f:保留两位小数。转义字符:在格式字符串中表示特殊含义。转义序列含义\n换行\t水平制表(Tab)\b退格\r回车(不换行)\\反斜杠本身\'单引号\"双引号其他输出函数:putchar()用于输出单个字符。charch='A';putchar(ch);// 输出 Aputchar('\n');// 输出换行数据的输入最常用的输入函数是scanf(),用于从标准输入设备(通常是键盘)读取格式化的数据。scanf("格式控制字符串",地址列表);格式控制字符串:包含格式说明符(与printf类似),通常只包含格式符,用空白字符分隔。格式说明符注意事项:%f用于输入float类型变量。%lf用于输入double类型变量(printf中%f可以输出double,但scanf必须区分)。%c会读取任何字符(包括空格、换行),若需跳过空白,应在格式串前加空格,如" %c"。%s用于输入字符串,遇到空白字符(空格、制表、换行)停止,自动在末尾加\0。地址列表:变量前必须加取地址运算符(数组名和指针变量除外)。例如a。其他输入函数:getchar()用于读取单个字符。charch=getchar();// 从键盘读取一个字符C 语言顺序结构程序设计方法顺序结构是程序设计的基石,其核心思想是将问题的求解步骤分解为一系列按顺序执行的语句。各语句按自上而下的顺序执行,执行完上一个语句就自动执行下一个语句,是无条件的,不必做任何判断。设计顺序结构程序时,遵循“输入→处理→输出”的IPO模型。示例:输入两个整数,求和并输出。#includestdio.hintmain(){inta,b,sum;printf("请输入两个整数:");scanf("%d %d",a,b);// 输入sum=a+b;// 处理printf("和 = %d\n",sum);// 输出return0;}// 输入:10 20// 输出:和 = 30(AI生成:顺序结构是其他控制结构的基础,任何复杂程序都可以分解为顺序执行的若干步骤。例如,先定义变量,再输入数据,然后进行计算,最后输出结果。)选择结构和循环结构程序设计实现选择结构的控制语句及程序设计方法选择结构(分支结构)允许程序根据条件的真假,选择执行不同的语句序列。常用控制语句:if和switch。1.if语句单分支:if(条件){语句序列;}双分支:if(条件){语句序列1;}else{语句序列2;}多分支(else if):if(条件1){语句序列1;}elseif(条件2){语句序列2;}else{语句序列3;}示例:判断奇偶intnum=5;if(num%2==0){printf("%d 是偶数\n",num);}else{printf("%d 是奇数\n",num);}// 输出:5 是奇数2.switch语句根据一个整型表达式的值,跳转到不同的case标签执行。switch(表达式){case常量表达式1:语句序列1;break;case常量表达式2:语句序列2;break;...default:语句序列n;}break用于跳出switch,若无break则继续执行下一个case(穿透)。default可选,处理所有不匹配的情况。示例:根据输入数字输出对应星期几intday=3;switch(day){case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3:printf("Wednesday\n");break;case4:printf("Thursday\n");break;case5:printf("Friday\n");break;case6:printf("Saturday\n");break;case7:printf("Sunday\n");break;default:printf("Invalid day\n");}// 输出:Wednesday(AI生成:选择结构程序设计时,需注意条件表达式的写法,避免混淆=和==,以及switch中忘记break导致的穿透。另外,switch表达式必须是整型,不能是浮点型或字符串。)实现循环结构的控制语句及程序设计方法循环结构用于重复执行某段代码,直到条件不再满足。C语言提供三种循环:while、do-while和for。1.while循环while(条件){语句序列;}先判断条件,条件为真时执行循环体,可能一次都不执行。示例:计算 1+2+…+100inti=1,sum=0;while(i=100){sum+=i;i++;}printf("sum = %d\n",sum);// 输出:50502.do-while循环do{语句序列;