




已阅读5页,还剩216页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中级语言 C语言是国际上广泛使用的高级语言 是一种结构化的程序设计语言 它即具有高级语言的特性 又具低级语言的特性 因此 既能编写系统软件 又能编写应用软件 高级语言 汇编语言 C C语言的特点 语言简洁 灵活 关键字少 32个 运算符丰富数据结构丰富结构化语言语法限制不严格能够对硬件和内存进行操作代码质量和效率高移植性好 结构化语言 C语言允许分割代码和数据可以使用具有局部 临时 变量的函数或代码块来实现这种特性代码块 程序块 是逻辑上连接在一起的一组程序语句 可以当作一个单元来使用 intSum inta intiSum 0 inti 1 while i a iSum iSum i i returniSum 程序结构 include 预处理命令 intcount 0 全局变量声明 intmain void 函数 printf HelloWorld n return0 由一个或者多个 C文件构成每一个 C文件可以由预处理命令 全局变量声明 函数和注释组成C程序被分割成一个个的函数 有且仅有一个main函数程序执行时先将控制权传递给main函数 主函数 函数由函数的首部 函数第一行 和函数体 一对花括号中的内容 组成 程序结构 intmax inta intb if a b returna elsereturnb 函数的首部 类型 名称 参数类型和参数名 圆括号内参数有无都可以 但括号不能省略函数定义后面接一个大括号 叫分隔符 代表代码块开始 代表结束 程序结构 include 预处理命令 intmax inta intb 函数原形声明 intmain void 函数 intnum1 num2 result printf 请输入两个整数 scanf d d 函数由声明部分和执行部分组成C语言使用分号 表示语句结束不识别回车 空格或制表符 这些符号使代码美观 建议一行写一条语句 一条语句可以跨多行注释用于描述特定的命令 函数或程序 增强程序的可读性多行注释用 开始 用 结束 标准C语言 一行注释用 标出 C语言库 C编译器都提供有标准函数库DOS下的C编译器TurboC2 0大约有440个函数BC 2 0大约有500多个函数VC 除了标准的C运行库及C语言扩展外 还有600多个WindowsAPI 以及VC 中的类库 MFC Linux下的C也有很多扩展及系统函数程序员编写的函数可以放在库中 然后在需要时使用有些编译器允许将函数放在标准库中有些编译器需要创建单独的库 编译和运行程序 include文件 库文件 源文件 编译器 目标文件 链接器 可执行文件 其他用户生成的目标文件 C程序开发过程 分析问题 编制程序 编译 连接 调试运行 完成 编译中发现错误 转回修改源程序 连接中发现错误 转回修改源程序 调试运行中发现问题 表明分析本身有错误 重新分析问题 变量 数据15 内存 通过变量 可以为内存中的位置提供一个有意义的名称 程序要为每一项数据分配内存 通常使用变量来存储数据 使用变量可以引用存储在内存中的数据 并随时根据需要显示数据或执行数据操纵需要多少内存数据被存储在哪里操作系统负责集注变量在内存中的地址要引用内存空间中的值 只需指定变量名 常量 常量就是一个保持不变的值示例9数字 整型常量9 3数字 浮点常量 NAME 字符串常量 A 字符常量符号常量 defineNUM100提高代码的可读性 还可以做到一改全改使用const关键字constintiNum 100 标识符 变量 函数 标签和其他各种用户定义的对象的名称都称为标识符 字母 数字和下划线 字母开头 正确的标识符名称Arena s count marks40 class one不正确的标识符示例1sttest oh god start end标识符的长度可以是任何合适的数值 但是各种编译器能够识别的变量中的字符数目有所不同C语言中的标识符区分大小写 系统内置的标识符指的是系统函数名称 系统定义的结构体名称 系统定义的符号常量名称等例如 printf FILE date RED等以上各种标识符不要用于用户定义的标识符上 防止发生不必要的错误 关键字 在一个特定语言的上下文中有特殊意义的单词 是标识符的一个特殊的集合 在C语言中有预先定义好的特殊意义 不能用于其他任何目的 所有的数据类型都是保留的关键字所有的关键字小写C语言的关键字共32个 数据类型分类 变量的声明和初始化 数据类型描述了变量中将存放的数据的种类数据类型位于变量名的前面例如 数据类型int将位于变量名varName的前面变量声明必须放在变量使用之前 先定义后使用 一般放在函数体的开头部分 可执行代码的前面变量声明也可以放在代码块的前面 程序中常常需要对一些变量预先设定初始值定义时初始化变量Datatypevariablename value 例如 intnum1 num2 12 定义后初始化变量variablename value 例如 intnum num 12 变量的内存分配 voidmain intnNum 300 0 x0000012CcharcStr A 0 x41charcCh printf d n nNum printf c n cStr printf c n cCh 基本数据类型 void char double 基本数据类型 float int 单个或多个数字系列 存储含有小数位 超出float类型大小的值 存放一个字符 没有任何类型的数据 int类型 存储数字数据 不能存储类似于 Alan 或 abc 等任何其他类型的数据声明方式 intnum 分配32位 4个字节 的内存空间int类型在16位系统中和在32位系统中 所占用字节数是不一样的 TC2 0下占2个字节 十进制整型常量没有前缀 0 9的数字组成示例 12322 0 232八进制整型常量以 打头 由0 7的数字组成示例 023 0101十六进制整型常量以0X或0 x打头 由0 9 A F或a f组成示例 0 xff 0X2A float类型 存储整数或包含小数位的值声明方式 floatnum 小数点后 有效数字是6位分配32位 4个字节 的内存空间示例 23 05 56 5 32 0 3 14159 double类型 存储超出float类型大小的限制的值声明方式 doublenum 有效数字是17位分配64位 8个字节 的内存空间示例 123 45678901234567 char类型 存储一个字符信息声明方式 chargender gender M 分配8位 1个字节 的内存空间示例 a m 1 5 实质是占一个字节的整型数 小整数 void类型 告诉编译器没有任何类型的值不能像其它数据类型一样来声明变量例如 voidnum 这是错误的声明 但是void可以用在指针声明中void作用在函数声明中使用 代表不返回任何值与指针搭配使用 派生数据类型 int short shortint 派生数据类型 基本数据类型 数据类型修饰符 int unsignedint unsigned int double longint longdouble long 只允许正数 是int所占空间的一半 和int double占的内存空间一样 控制台 默认整个屏幕共有80列 或40列 25行的文本单元 每个单元包括一个字符和一个属性 字符即ASCII码字符控制台的注意事项 当输出超出屏幕的右边界时会自动转到下一行的开始处继续输出 当屏幕内填满内容仍没有结束输出时 屏幕将会自动逐行上卷直到输出结束为止 头文件stdio h includestdio h是一个文件 称为头文件包括对应于C语言程序中使用的输入 输出函数的宏 printf 用于带格式的输出scanf 用于带格式的输入 printf 功能 用于在标准输出设备控制台上显示数据函数原型及参数 控制字符串由三类项目中的一项或多项组成 文本字符 由可打印字符组成格式命令 以 符号开始 随后紧跟与数据项相应的格式代码非打印字符 包括制表符 空格和新行返回值 输出的字符数量 如果错误返回EOF intprintf controlstring argumentlist 控制字符串 参数列表 需要由 括起来 由文本字符 格式命令和非打印字符组成 都需要一个格式命令 与参数列表需要在数量 类型和顺序上匹配 格式代码 上表中 c d f lf e g u s o和x都是类型说明符 格式代码 转义系列 printf 修饰符 字符宽度修饰符 例如 printf 4d 500 可以用于浮点型 双精度型和字符数组型 字符串 范围宽度修饰符是一个整数 定义了数据项的最大范围宽度 修饰符 例如 printf d 500 数据项在范围内向左对齐 从范围最左侧的位置开始输出数据项精度修饰符 例如 printf 2f 3 14159 用在浮点型 双精度型或字符数组型 字符串 中 如果用在浮点型或双精度型数据中 数字字符串表示小数右侧最多可输出的数字位数 printf 修饰符 0 修饰符 填充在数字左边 右边无效 保证数据准确性 字段的默认填充符是空格 如果用户希望用零作为填充符 需要使用此修饰符 l 修饰符可以借助于此修饰符将整数显示为长整型或双精度型参数 相应的格式代码为 ld h 修饰符此修饰符用于显示短整数 相应的格式代码为 hd 修饰符如果用户不希望预先指定字段宽度 而希望程序来指定 则需要用到此修饰符printf f 8 2 123 456 scanf 函数功能 用于接受数据函数原型 返回值 输入成功的参数数量 否则返回0 intscanf controlstring argumentlist 控制字符串 参数列表 printf 语句中的使用的格式极其语法同样适用与scanf 语句 printf 和scanf 参数的区别 格式代码的区别 没有 g选项 格式代码 f和 e在效果上是一样的参数列表的区别 printf 使用变量名 常量 符号常量和表达式 scanf 使用变量指针 参数列表应遵循以下规则 如果希望读取基本数据类型变量的值 应在变量名的前面加上符号 当读取指针变量指向的值时 在变量名前不能使用 缓冲输入 输出 缓冲区 流 负责在输入 输出设备和程序之间建立联系 输入设备 内存缓冲区 stdin 程序程序 内存缓冲区 stdout 输出设备是一块临时的存储区域 或在内存中 或在设备控制卡上 缓冲输入 输出 控制台输入 输出 缓冲文件输入 输出 控制台输入 输出 控制台输入 输出函数将其操作指向系统的标准输入 键盘 和标准输出 显示器 C语言中最简单的控制台输入 输出是 getchar 从键盘读取一个 且仅一个 字符putchar 在屏幕上输出一个字符 getchar 函数原型 intgetchar void 没有参数函数功能 从终端输入一个字符 返回值 返回输入字符的ASCII码 可以使用字符变量或者整型变量接收 其它说明 getchar 函数没有参数 但仍然必须使用括号缓冲字符 直到用户按回车键 虽然可以输入多个字符 但函数只接受第一个字符 putchar 函数原型 intputchar intc 函数功能 从终端输出一个字符 且转换成ASCII码返回 函数参数 其中c要输出的字符 可以是字符型常量 字符型变量 整型常量 整型变量表达式 转义序列等 putchar 的选项和效果 如下表 getch include include getch 的头文件voidmain intnum 0 charch 0 num getch 输入1printf d num fflush stdin ch getch printf ch c ch 看一下有什么效果fflush stdin getch printf end 表达式 用运算符和括号将操作数连接起来的 符合 语言语法规则的式子 称为表达式运算符和操作数的有效组合操作数可以是变量 常量或者函数在程序执行的过程中 变量的实际值和表达式中出现的常量一起使用表达式可分为 算术表达式关系表达式逻辑表达式函数表达式 操作数 运算符 2 y 5 运算符 根据操作数的数量可以分为 一元运算符 二元运算符和三元运算符根据用途可以分为以下几类 赋值运算符算术运算符关系运算符逻辑运算符位运算符 运算符的优先级和结合方向按运算符的优先级高低次序执行如果在一个运算对象 或称操作数 两侧的运算符的优先级相同 则按 语言规定的结合方向 结合性 进行 算术运算符 两边必须是整数 幂函数的示例 pow 9 0 2 0 9是底数 2是指数结果是9 9 81 和 运算符前置和后置有很大区别 算术运算符之间的优先级 所谓结合性是指 当一个操作数两侧的运算符具有相同的优先级时 该操作数是先与左边的运算符结合 还是先与右边的运算符结合 自左至右的结合方向 称为左结合性 反之 称为右结合性 计算 i 赋值运算符 赋值符号 就是赋值运算符 它的作用是将一个表达式的值赋给一个变量 通用的形式 变量名 表达式将同一个值赋给多个变量的操作叫做多重赋值 a b c 10 inta intb intc 10 但是 不能像下面的语句中那样赋值 复合赋值运算符 还可以与位运算符构成复合赋值运算符 如 赋值运算符之间的优先级 所有的赋值运算符的优先级相同始终按从右向左顺序进行计算 a b c 5 赋值运算符的优先级低于算术运算符 仅高于逗号运算赋值表达式由赋值运算符或复合赋值运算符 将一个变量和一个表达式连接起来的表达式 称为赋值表达式 赋值表达式的值 任何一个表达式都有一个值 赋值表达式也不例外 被赋值变量的值 就是赋值表达式的值 关系运算符及之间的优先级 用于测试两个操作数或两个表达式之间的关系 其中操作数可以是变量 常量和表达式 关系表达式的计算结果 逻辑值 真 非0或假 0 注意 1 if a 1 不要写成if a 1 最好写成if 1 a 因为如果写成if 1 a 编译器会报错2 不能写成if 1 a 5 逻辑运算符 逻辑运算符用于对包含关系运算符的表达式进行合并或取非使用逻辑运算符的表达式 返回0表示假 返回1表示真示例 if a 10 a 20 逻辑表达式计算有时会出现部分表达式不参加运算的情况 短路现象 例子 inta 1 b 2 if a 5 b 10 printf b d n b 观察b的值 位运算符 位运算符将数字视为二进制值 并按位进行相应运算 运算完成后再重新转换为数字 类型转换 运算符的操作数属于不同的数据类型 运算时通常会将这些操作数转换为同一类型 由编译系统自动完成 charch inti result floatf doubled result ch i f d f i intdoublefloatdoubledouble 在赋值表达式中 自动将赋值运算符右边表达式的值的类型转换成左边变量的类型级别高低char short int long unsignedint float double longdouble 强制类型转换 通过使用转换可以将一个表达式强制转换成某一种类型 是一元运算符 转换的通用语法是 type casttype任意有效的C数据类型示例 经过赋值运算后 int f返回的整型值重新转换为浮点数 f本身的值不变 floatx f f 3 14159 x int f 运算符优先级示例 2 3 4 2 3 3 5 10 9 计算如下 2 3 4 2 3 3 5 10 9 2 3 4 2 3 3 5 10 9 6 2 3 3 5 10 9 8 3 3 5 10 9 1 3 5 10 9 1 1 10 9 1 10 9 1 首先计算算术运算符 比较运算符 计算总左到右进行 最后计算逻辑运算符 运算符优先级 优先级建立了计算算术表达式时 一组运算符相对于另一组的层次关系优先级指C语言计算运算符的顺序可通过将表达式括在括号中来改变运算符的优先级优先级别相同 运算次序由结合方向决定运算符的结合方式有两种 左结合和右结合不同的运算符要求有不同的运算对象个数当一个表达式中的运算符具有相同优先级时 结合性还指出C语言计算这些运算符的顺序 运算符之间的优先级 一般来说 算术运算符优先级高于比较运算符高于逻辑运算符高于赋值运算符 if语句 通过条件为真还是为假来决定常规格式 if 表达式 语句 表达式是要判断的条件 跟在后面的是一个或一组语句在if后的语句不止一个 应用大括号 将他们组织起来 这样的组会称为 复合语句 或 代码块 如果只有一个语句 大括号 可以省略 但不建议 if else 语句 可以选择两个语句中的一个来执行语法形式 if 表达式 语句 1 else 语句 2 如果if表达式的值为true 非0 将执行if语句 一个或一组 后的语句块如果if表达式的值为false 0 那么控制权将交给else表达式后面的语句else语句是可选的 仅当if表达式的值为false时 才会执行else后的语句或语句序列 if elseif 语句 if else if语句也称为if else if台阶或if else if阶梯条件的计算是自顶向下的建议书写格式 if 表达式 语句 elseif 表达式 语句 elseif 表达式 语句 else语句 嵌套的if语句 嵌套的if语句就是在if或else语句中包含另一个if语句在C语言中 else语句通常与同一块中距离它最近且未与else关联的if语句相匹配 与书写格式无关 语法示例 if 表达式 1 if 表达式 2 语句 1 if 表达式 3 语句 2 else语句 3 与if 表达式 3 相匹配 else语句 4 与if 表达式 1 相匹配 switch语句 switch语句是一种多路判定语句 它判断表达式的值是否与整数或字符常量列表中的某个值相匹配若找到了相应的匹配 就会执行与常量关联的语句 通用语法 switch 表达式 case常量1 语句集 break case常量2 语句集break default 语句集 break switch语句 switch case 和default都是关键字 语句可以是简单或复合语句 switch后的表达式需要用圆括号括起来 而且switch语句的主题用 括起来计算表达式的数据类型要与指定的case常量的数据类型匹配 switch后的表达式可以包含任何变量名 也可以是常量 case后面只能是常量 整型和字符型 switch语句 switch语句执行过程 计算表达式的值 与case的值比较 条件运算符 条件运算符是C语言中唯一的三目运算符表达式1 表达式2 表达式3条件运算符的优先级高于赋值运算 低于关系和算术运算符结合方式 从右向左计算 a 3 b 30 a20 c 8 c 9 for循环 for循环的通用语法 for 初始化计数 条件测试 再求值参数 语句 如果是复合语句 不能省略 初始化计数是一个赋值语句 它在进入循环前设置循环控制变量条件测试是一个关系表达式 它决定何时退出循环再求值参数定义每次执行循环时 循环控制变量如何变化for循环的三个部分必须用分号 隔开组成循环体的语句可以是单个语句 也可以是复合语句 分号 不能省略 for循环 要正确表达循环结构应注意三方面的问题 控制变量的初始化 循环的条件和控制变量的更新 工作原理 1 初始化计数 给循环变量赋初始值 2 条件测试 求值结果为true 就执行循环体内的代码执行 当条件变为false时退出循环 程序将继续执行for循环后面的语句3 循环变量变化计算4 重复第二步条件测试 逗号运算符 格式是 exprn1 exprn2 逗号运算符优先级最低表达式被逗号运算符隔开 从左向右求值 但只有其最右端的表达式的结果 作为整个逗号表达式的结果通过在for循环中包含多个初始化表达式或增量表达式 可以丰富for循环中表达式 for循环 使用for循环可以包含部分定义 或不包含任何定义for num 100 或for 使用for循环可以不包含任何循环体 语句 有助于提高某些算法的效率和创建时间延迟循环for i 0 i xyz value i while循环 表达式一般为关系表达式或者逻辑表达式语句可以是空语句 一个简单的语句或语句块如果while循环中包含一组语句 必须用 括起来只要条件为真循环就会迭代 通用语法 while 表达式 语句 do while循环 while后面的分号不能省略do while循环中 循环体中的代码在条件测试执行前执行一次条件为False时 dowhile循环终止 控制权传递给紧跟在while语句之后的语句 do 语句 while 条件 通用语法 3种循环的区别和总结 while和for语句先判断循环控制条件 do while语句后判断循环控制条件 所以 while和for语句的循环体可能一次也不执行 而do while语句的循环体至少也要执行一次 三种循环可以处理同一问题 一般情况可以互相代替 但在实际应用中 我们要根据具体情况来选用不同的循环语句 选用的一般原则如下 如果循环次数在执行循环体之前就已确定 一般用for语句 如果循环次数是根据循环体的执行情况确定的 一般用while语句或者do while语句 当循环体至少执行一次时 用do while语句 反之 如果循环体可能一次也不执行时 用while语句 嵌套循环 如果一个循环出现在另一个循环中 则称它为嵌套循环 三种循环都可以相互嵌套 自由组合 for i 1 i max1 i for j 0 j max2 j return语句 表达式是可选的return语句用于从函数中返回return语句可以带有值 该值将返回给调用程序它使执行返回到调用函数的位置一个函数中可以使用多个return语句 但是遇到第一个return语句时返回 returnexpression 通用语法 goto语句 需要在函数中某行代码处 定义一个标签goto语句将控制权传递给C程序中同一函数内的其他语句它实际上违背了严格的结构化程序设计语言的原则它们降低了程序的可靠性 并使得程序难以维护 gotolabel 通用语法 break语句 break 通用语法 用于在switch语句中终止case也可以用于在循环中突然终止循环当循环中遇到break语句时 循环立即终止 控制权传递给循环之后的语句多层循环中 break只向外跳一层 continue语句 continue语句 只能在循环中使用让封闭循环进行下一次迭代遇到该语句时 跳过循环体中剩余的语句 控制权传递给重新初始化步骤在while循环和do while循环中 程序控制权传递个条件测试语句在for循环中 continue影响循环的增量部分 然后执行条件测试 continue 通用语法 exit 函数 exit 用于跳出一个程序是一个标准库函数该函数的用途是立即终止程序 控制权交给操作系统 exit intreturn code 通用语法 数组及相关概念 为什么需要使用数组 数组是一组有序的 类型相同的数据的集合 这些数据被称为数组的元素 每个数组都有一个名字 我们称之为数组名 数组名代表数组的起始地址 数组元素由索引或下标标识 索引或下标从0开始 一个包含11个元素的数组 定义数组 数组的特性必须在使用前定义存储类型数据类型数组名数组大小数组定义的语法 存储类型数据类型数组名 数组长度 例如 intplayer 11 数组名后接一个或多个括在方括号内的表达式 用以指定数组的维数数组长度只能是常量和常量表达式 大于0 数组的规范 所有数组元素具有相同的类型允许使用变量的地方都可以使用数组元素可以使用整型表达式引用数组的元素 数组名 整型表达式 一维数组的定义 一维数组在内存中的存放 每个数据元素占用的字节数 就是基类型的字节数一个元素占4个字节 一维数组 floatmark 100 一维数组的初始化 自动数组中的元素需要分别初始化extern和static数组元素自动初始化为0数组初始化是在数组定义时给元素赋初值初始化赋值的一般形式 类型数组名 常量表达式 值 值 例如 intary 10 0 1 2 3 4 5 6 7 8 9 初始化的几点规定 元素之间用逗号隔开可以只给部分元素赋值 剩余元素赋0值给全部元素赋值时 可以不说明元素的个数 一维数组初始化示例及注意示例 1 intary1 10 1 2 3 4 5 6 7 8 9 10 2 intary1 1 2 3 4 5 6 7 8 9 10 隐式指定数组的元素个数为10 3 ary1 0 1 ary1 1 2 ary1 2 3 4 intary2 10 1 2 3 4 5 初始化的数据个数允许少于数组的长度 但不能多于数组的长度 想想ary2 5 5 intary3 5 ary3 0 1 ary3 1 2 思考ary3 2 6 intary4 错误不允许 C编译器不会检查下标的越界即使两个数组的类型和大小相同 也不能检验是否相等不能直接将一个数组赋给另一个数组不能为数组整体赋值 二维数组 最常用的多维数组可以看成是由两个一维数组组成的数组类似于一个由行和列组成的表格二维数组的声明方式 类型说明符数组名 常量表达式1 常量表达式1 例如 inttemp 4 3 问题 二维数组的数组名可以代表什么 二维数组的定义 二维数组的初始化 可以用下面4种方法对二维数组初始化 数据类型数组名 常量表达式1 常量表达式2 初始化数据 1 分行给二维数组赋初值 如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 2 可以将所有数据写在一个花括弧内 按数组排列的顺序对各元素赋初值 如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 二维数组的初始化 3 可以对部分元素赋初值 如inta 3 4 1 5 9 也可以对各行中的某一元素赋初值 如inta 3 4 1 0 6 0 0 11 100050009000 1000060000110 100056000000 也可以只对某几行元素赋初值 如 inta 3 4 1 5 6 二维数组的初始化 4 如果对全部元素都赋初值 则定义数组时对第一维的长度可以不指定 但第二维的长度不能省 如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 它等价于 inta 4 1 2 3 4 5 6 7 8 9 10 11 12 intb 4 0 思考b有几个字节 在定义时也可以只对部分元素赋初值而省略第一维的长度 但应分行赋初值 如 inta 4 0 0 3 0 10 0030000001000 二维数组的引用 存储形式 二维数组在内存中是按行的顺序存放的 即先存放第一行的元素 再存放第二行的元素 二维数组元素的引用 数组名 行下标 列下标 例如 ary 1 3 12 字符串常量 字符串常量是由一对双引号括起来的字符序列字符串中的每个字符作为一个数组元素存储 占用1个字节 例如字符串 WELLCOME 在内存中按照如下方式存储 字符数组与字符串 C语言没有专门的字符串变量 字符串的存储必须通过字符数组来实现 一维字符数组用于存储1个字符串 每个元素存放1个字符 二维字符数组用于同时存储多个字符串 每一行存储1个字符串 空字符 0 自动添加到字符串的内部表示中止 它占内存但不记入字符串长度字符数组的定义 初始化和元素的引用与一般数组相同 可以将字符串常量赋给字符串变量 字符串变量的声明 典型的字符串变量声明语句如下所示 charstr 10 在声明字符串变量时 应该为这个空结束符预留一个额外元素的空间str是一个字符数组变量 它最多可以容纳包括空结束符在内的10个字符 字符串变量的初始化 声明字符串并初始化 charstr1 6 hello charstr2 6 hello charstr3 6 h e l l o charstr4 h e l l o 不是字符串 charstr5 h e l l o 0 注意 hello 占五个字节 但此时应为 0 预留一个字节当初始化的字符 至少要有一个 少于字符数组的长度时 未初始化部分将被编译系统自动用空字符 0 赋值 二维字符串变量的初始化 charbuf 2 10 aaa bbb charbuf 10 aaa bbb charbuf 3 10 aaa bbb 那么buf 2 charbuf 3 10 0 那么buf 0 buf 1 buf 2 charbuf 10 0 那么buf 0 buf 1 buf 2 字符串变量的使用 字符串也是一维数组 同样享有一维数组的所有特征 例如 charstr1 20 abc str2 20 str2 str1 错误 str2 abc 错误 str1 str2 没意义 同样可以通过数组名与下标访问其数组元素 例如 charstr 6 hello str 0 H 把字符h改成字符H 字符串可以通过系统函数进行整体操作 字符串I O操作 字符串I O操作是通过函数来实现的 这些函数是标准I O库stdio h的一部分回顾scanf 和printf 函数 这两个函数用于使用一条语句来接受并显示混合数据类型接受字符串的语法如下所示 scanf s str 显示字符串的语法如下所示 printf s str gets 功能说明 是接受通过标准输入所获得的字符串的最简单的方法 它接受按下回车键以前输入的所有字符 包括空格 并用 0 字符替换末尾的换行符 n 函数原型 返回值 成功时返回输出缓冲区首地址 否则返回NULL例如 charname 50 printf enteryourname gets name char gets char buffer 存放输入数据的首地址 puts 功能说明 用于在标准输出设备上显示字符串 并把末尾的字符串结束符 0 替换成换行符 n 字符输出函数原型 返回值 成功时返回最后一个字符的ASCII码 n 否则返回EOF例如 puts mynameis 会输出换行符 puts name intputs constchar string 要输出字符串的首地址 sprintf 功能说明 将其他数据类型转换成字符串类型并输出到指定字符串中函数原型 函数参数 buffer是字符数组名format是格式化字符串返回值 buffer中字符的个数 否则返回EOF intsprintf char buffer constchar format argument 指定字符串的首地址 字符串函数 处理字符串的函数可以在标准头文件string h中找到 下面列举了这些函数执行的一些操作 连接字符串 strcat 比较字符串 strcmp 在字符串中查找一个 或多个 字符 strchr strstr 将一个字符串复制到另一个字符串中 strcpy 计算字符串的长度 strlen strlen 功能说明 确定字符串的长度 不包括 0 的长度函数原型 返回值 字符串实际长度 即字符串 0 之前的字符个数 intstrlen constchar string 求长度的字符串首地址 strcpy 功能说明 将一个字符串中的值复制到另一个字符串中函数原型 返回值 成功时返回dest 否则返回NULL说明 dest必须足够大以便能够容纳被复制的字符串 建议使用strncpy 函数 问题 如何进行字符串自身复制 char strcpy char dest constchar source 目标字符串首地址 要复制的字符串首地址 strcat 功能说明 将两个字符串连接成一个字符串 将source接到dest的末尾 函数原型 成功时返回连接成功后的首地址即dest 否则返回NULL说明 dest必须足够大 连接时只在新串最后保留一个 0 char strcat char dest constchar source 目标字符串的首地址 要连接的字符串首地址 strcmp 功能说明 比较两个字符串并根据比较的结果返回一个整数值函数原型 函数返回值的情况如下 如果str1str2 则返回值大于零比较原则 从左至右逐个对应字符按其ASCII码值大小相比较 直到出现不同的字符或遇到 0 为止 intstrcmp constchar str1 constchar str2 字符串1的首地址 字符串2的首地址 strchr 功能说明 判断某个字符是否在字符串中出现函数原型 该函数返回值的情况如下 如果该字符在字符串中出现 将返回对应这个字符 由chr所指向的 在字符串str中第一次出现的指针如果未出现 则返回NULL char strchr constchar str charch 字符串首地址 要查找的字符 strstr 功能说明 判断某个字符子串是否在一字符串中出现函数原型 该函数返回值的情况如下 如果该字符串sub在字符串中出现 将返回对应这个字符串 由sub所指向的 在字符串parent中第一次出现的指针如果未出现 则返回NULL char strstr constchar parent constchar sub 字符串首地址 要查找的字符子串 strlwr 和strupr strlwr函数其一般形式为 strlwr 字符串 strlwr函数的作用是将字符串中大写字母换成小写字母 strupr函数其一般形式为 strupr 字符串 strupr函数的作用是将字符串中小写字母换成大写字母 以上介绍了常用的8种字符串处理函数 应当再次强调 库函数并非C语言本身的组成部分 而是C编译系统为方便用户使用而提供的公共函数 不同的编译系统提供的函数数量和函数名 函数功能都不尽相同 使用时要小心 必要时查一下库函数手册 ctype h中的字符函数 stdlib h中的类型转换函数 sprintf 的应用 1 格式化数字字符串 itoa sprintf s d 123 2 控制浮点数打印格式sprintf s 3f 3 1415626 3 连接字符串 strcat sprintf s slove s i CSDN 4 打印地址信息sprintf s p sscanf 的应用 2 有一个二维字符串数组characBuf 50 IP 192 168 0 128 SUBNET 255 255 255 0 SSG 192 168 0 254 DNS 218 85 157 99 要求用sscanf分别获取等号左右两边的字符串 并显示出来 例如第一行显示 IP为192 168 0 128 1 格式化数字字符串 atoi intx 0 sscanf 123 d 函数的定义结构 type specifierfunction name arguments 执行部分 返回值的数据类型 有效的函数名 形式参数 函数的参数 函数的参数分为形参和实参两种 作用是实现数据传送 形参出现在函数定义中 只能在该函数体内使用 发生函数调用时 调用函数把实参的值复制1份 传送给被调用函数的形参 从而实现调用函数向被调用函数的数据传送 其它说明 实参可以是常量 变量 表达式 函数等 形参变量只有在被调用时 才分配内存单元 调用结束时 即刻释放所分配的内存单元 实参和形参占用不同的内存单元 即使同名互不影响 在被定义的函数中 必须指定形参的类型实参与形参的类型应相同或赋值兼容 函数的返回值 将控制权从函数传回主调程序把return语句中的内容返回给主调程序 intsquarer intx intiResult 0 iResult x x returniResult 通常 希望通过函数调用使主调函数能得到一个确定的值 这就是函数的返回值 例如 max 2 3 的值是 函数的数据类型 在定义函数时 对函数类型的说明 应与return语句中 返回值表达式的类型一致 如果返回的是一个整型值或者没有返回值 可以省略类型标识符为了避免出现不一致 最好指定数据类型 intsquarer intx intiResult 0 iResult x x returniResult 良好的程序设计习惯 为了使程序具有良好的可读性并减少出错 凡不要求返回值的函数都应定义为空类型 即使函数类型为整型 也不使用系统的缺省处理 函数返回值说明 1 函数的返回值是通过函数中的return语句获得的 一个函数中可以有一个以上的return语句 执行到哪一个return语句 哪一个语句起作用 return语句后面的括弧也可以不要 如 return 等价于 return 2 函数的返回值应当属于某一个确定的类型 在定义函数时指定函数返回值的类型 在 语言中 凡不加类型说明的函数 自动按整型处理 3 在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致 如果函数值的类型和return语句中表达式的值不一致 则以函数类型为准 对数值型数据 可以自动进行类型转换 4 如果被调用函数中没有return 返回一个不确定值 对于不带回值的函数 应当用 void 定义函数为 无类型 或称 空类型 此时在函数体中不得出现return语句 函数原型与函数声明 在定义之前使用函数 必须声明 否则 一些编译器会返回错误采用函数原型方式 对被调用函数进行说明 其一般格式如下 函数类型函数名 数据类型 参数名 数据类型 参数名2 includevoidmain swap voidswap includevoidswap voidmain swap 编译通过 voidswap 错误 标示符未声明 函数调用 函数调用的一般形式为 函数名 实际参数表 调用函数时 函数名称必须与具有该功能的自定义函数名称完全一致 实参在个数 类型和顺序与被调用函数的形参 必须一一对应和匹配 如果类型不匹配 C编译程序将按赋值兼容的规则进行转换 主调函数 被调函数 函数调用条件 在一个函数中调用另一函数 即被调用函数 需要具备哪些条件呢 首先被调用的函数必须是已经存在的函数 是库函数或用户自己定义的函数 如果使用库函数 还应该在本文件开头用 include命令将调用有关库函数时所需用到的信息 包含 到本文件中来 如果使用用户自己定义的函数 而该函数的位置在调用它的函数 即主调函数 的后面 在同一个文件中 应该在主调函数中对被调用的函数作声明 文件包含 文件包含 是指一个源文件可以将另外一个源文件的全部内容包含进来 作用 使编译系统把指定的被包含文件嵌入到带有 include的源文件中 示意图 A B函数的声明 B A include file1 h 包含 file2 c file1 h file1 c A函数的声明 定义和声明 注意 函数的 定义 和 声明 不是一回事 函数的定义是指对函数功能的确立 包括指定函数名 函数值类型 形参及其类型 函数体等 它是一个完整的 独立的函数单位 而函数的声明的作用则是把函数的名字 函数类型以及形参的类型 个数和顺序通知编译系统 以便在调用该函数时 编译系统能正确识别函数并检查调用是否合法 例如函数名是否正确 实参与形参的类型和个数是否一致 注 系统不会检查参数名 函数调用的嵌套 函数的嵌套调用是指 在执行被调用函数时 被调用函数又调用了其它函数 f2 f1 f2 后续语句 main f1 后续语句 函数的递归调用 一个函数在它的函数体内调用它自身称为递归调用 这种函数称为递归函数 语言允许函数的递归调用 在递归调用中 主调函数又是被调函数 间接递归为了防止递归调用无终止地进行 必须在函数内有终止递归调用的手段 常用的办法是加条件判断 满足某种条件后就不再作递归调用 然后逐层返回 直接调用 间接调用 递归求阶乘 includeintfactorial intiNum intmain intn 10 printf i dfactorial d n i factorial n 计算10的阶乘return0 intfactorial intiNum if iNum 1 return1 elsereturn iNum factorial iNum 1 参数传递 25 内存地址 100 25 内存地址 100 25 100 调用一个函数时 调用函数和被调用函数之间会发生数据传递 有两种数据传递方式 按值传递按地址传递 按值传递 变量的值被传递给被调函数 并且对这个值的任何改变都不会影响被传变量的原始值默认情况下 函数参数都是按值传递的参数值是通过临时变量传递的所有操作都针对这些临时变量 数组作为函数参数 一维数组元素作函数实参 数组元素作为函数的实参 与用变量作实参一样 是单向传递 即 值传送 方式 例如 voidswap intx inty 调用swap a 0 a 1 二维数组作函数形参 一维数组元素作函数形参 一维数组作函数形参 数组作为函数参数 形参和实参都用数组名 如 voidf intaiNO intnNum aiNO 0 1 aiNO 1 2 nNum 3 voidmain intaiNO 10 0 nNumber 5 f aiNO nNumber printf d d d aiNO 0 aiNO 1 nNumber 观察这三个值有什么变化 数组作为函数形参 1 实参数组名代表数组元素的首地址而形参是用来接收从实参传递过来的数组首元素地址2 在被调用函数中声明形参数组的大小为10 但在实际上 指定大小是不起作用的 C编译器对形参数组大小不做检查 只是将实参数组的首地址传给形参数组 数组作函数形参注意点 数据传递的几种方式 主调函数与被调函数进行数据传递的方式有以下几种 参数传递返回值全局变量 使用全局变量不符合程序设计中要求模块间 强内聚性 弱偶合性 的原则 使这些函数依赖这些全局变量 因而使得这些函数的独立性降低 使用全局变量过多 会降低程序的可读性和可维护性 局部变量和全局变量 局部变量在函数内部声明进入一个程序块时创建 退出该程序块时销毁形式参数在函数定义中被声明为参数在函数内部像局部变量一样使用全局变量 extern 在所有函数以外声明在程序的整个执行期间都拥有值 静态存储和动态存储 变量从变量值存在的时间 即生存期 角度分 静态存储方式和动态存储方式静态 由系统分配固定的存储空间 全局变量就存储在静态存储区动态 系统根据需要进行动态的分配存储空间在动态存储区存放一下数据 1 函数形式参数2 自动变量 未加static声明 3 函数调用时的现场保护和返回地址 存储区域 内存中的存储区域包括下面几个部分 程序代码区 存放函数体的二进制代码静态区 全局区 static 全局变量和静态变量的存储区域堆区 heap 程序员分配释放栈区 stack 由编译器自动分配释放 存放函数的参数值 局部变量的值 存储类别 存储类别是数据在内存中的存储形式 是变量的属性 使用的一般语法 存储类别数据类型变量名称 例如 autointa staticintb 静态registerintI 寄存器变量externA 外部变量存储类别定义了 生命周期 保留特定值的时间长度可见性 程序的哪些部分将能够 看见 该变量 存储类别 自动的 auto auto可以省略外部的 extern intA 10 在另一个c文件使用externA 外部变量静态的 static 在静态存储区分配存储单元 在编译时赋初值 而且只赋初值一次 如果没有赋初值系统就会自动赋0或空字符寄存器的 r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025湖南省肿瘤医院高层次人才公开招聘44人考前自测高频考点模拟试题有答案详解
- 2025年湖南长沙水业集团有限公司春季校园招聘24人模拟试卷及完整答案详解1套
- 2025年宁夏医科大学自主公开招聘模拟试卷及答案详解(名师系列)
- 2025年甘肃庆阳华池县事业单位选调工作人员考前自测高频考点模拟试题及完整答案详解
- 2025北京林业大学附属实验小学招聘1人考前自测高频考点模拟试题及答案详解(历年真题)
- 小学安全培训情况总结课件
- 广汽丰田员工安全培训课件
- 广汉安全员培训时间课件
- 2025江苏南京交通职业技术学院招聘12人模拟试卷及答案详解(典优)
- 山西省【中职专业高考】2025年中职高考对口升学(理论考试)真题卷【土木建筑大类】模拟练习
- 学前儿童英语教育与活动指导(学前教育专业)全套教学课件
- 肿瘤疗效评估新标准mRECIST标准
- 网络热梗是否融入现实生活
- 乐乐课堂版奥数三年级
- 口腔疾病的预防与治疗措施
- 汽车机械基础 课件 绪论
- 客车检车员-中国铁路兰州局集团有限公司编
- 胖东来收银管理制度
- 中医护理操作并发症预防及处理
- 《混凝土结构耐久性电化学修复技术规程》
- 产后骨盆修复培训课件
评论
0/150
提交评论