C程序设计期末复习.ppt_第1页
C程序设计期末复习.ppt_第2页
C程序设计期末复习.ppt_第3页
C程序设计期末复习.ppt_第4页
C程序设计期末复习.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 C语言复习 第一章 第一章C语言概述第二章数据类型 运算符与表达式第三章最简单的C程序设计第四章选择结构程序设计第五章循环结构程序设计第六章数组第七章函数调用第八章指针第九章结构体类型与共用体 2 1 4简单的C语言程序 几个C程序C程序的基本组成C程序的书写风格一 几个C程序 本节概要 本篇目录 说明 每个C程序必须有一个主函数main 是函数开始和结束的标志 不可省略每个C语句以分号 结束使用标准库函数时应在程序开头一行写 include 求两数之和 includevoidmain void空类型 表明函数不需要返回值 inta b sum 声明 定义变量为整型 a 123 b 456 sum a b printf sumis d n sum 3 1 4简单的C语言程序 求两个数中的大者 includevoidmain 主函数 intmax intx inty 对被调用函数max的声明 inta b c 定义变量a b c scanf d d max函数结束 本节概要 本篇目录 说明 本程序包括main和被调用函数max两个函数 max函数的作用是将x和y中较大者的值赋给变量z return语句将z的值返回给主调函数main 例1 3 求两个数的大者 说明 表示注释 注 C 中注释改用 注释只是给人看的 对编译和运行不起作用 所以可以用汉字或英文字符表示 可以出现在一行中的最右侧 也可以单独成为一行 4 1 4简单的C语言程序 二 C程序的基本组成C语言是一种函数式的语言 C程序的全部工作都是由各个函数分别来完成的 C的函数相当于其它语言中的子程序 编写C程序就是编写一个个的函数 1 C程序是由函数构成的 这使得程序容易实现模块化 本节概要 本篇目录 5 1 4简单的C语言程序 本节概要 本篇目录 4 一个函数由两部分组成 函数的首部 例1 3中的max函数首部如下 intmax intx inty 函数体 花括号内的部分 若一个函数有多个花括号 则最外层的一对花括号为函数体的范围 2 一个C程序总是从main函数开始 在main函数中结束 而不论main函数在整个程序中的位置如何 注 一个C程序中必须有且只能有一个main函数 3 C语言无输入与输出语句 需由标准库函数printf scanf等来实现 6 1 4简单的C语言程序 三 C程序的书写风格 1 语句书写格式灵活 C语句以分号 结束 一行上可以书写多条语句 一条语句也可以分开写在连续的若干行上 2 缩进和注释用缩进表示程序 块 的层次结构用注释提高可读性 例如 本节概要 本篇目录 Example C 整型变量的定义与使用 includevoidmain inta c 定义整型变量 unsignedu 定义无符号整型变量 a 12 u 10 c a u printf a u d n c 运行结果为 a u 22 7 数据类型 运算符与表达式 第二章 程序的主要部分是数据和执行语句 计算机处理的对象是数据 程序中的数据是分属不同数据类型的 数据的类型决定了数据在内存中占空间的大小及存储方式的不同 C语言的数据类型常量与变量整型数据浮点型数据 字符型数据算术运算符与算术表达式不同类型数据间的转换逗号运算符和表达式 8 2 1C语言的数据类型 本篇概要 数据类型明显或隐含地规定了在程序执行期间变量或表达式所有可能取值的范围 以及在这些值上允许的操作 9 程序在对各种数据进行处理之前都要对其类型 即 存储格式 预先加以说明 这其一是要对这些数据分配相应的存储空间 其二是要说明程序处理数据时应采用何种具体的运算方法 例如 本篇概要 2 1C语言的数据类型 10 2 2常量与变量 常量是指在程序运行过程中 其值不能被改变的量 例如 123 456 3 678 符号常量的定义 宏定义命令 define习惯上 符号常量名用大写 变量名用小写 例2 1 c 使用符号常量 definePRICE30 includevoidmain intnum total num 10 total num PRICE printf total d n total 本篇概要 说明 如再用赋值语句给符号常量PRICE赋值是错误的 例如 PRICE 40 错误 不能给符号常量赋值 11 2 2常量与变量 变量是指在程序运行过程中 其值可以被改变的量 变量的定义及变量的赋值 先定义 后使用 定义的同时可以赋初值 变量的初始化 注意区分变量名和变量值这两个不同的概念 例如 inta 3 本篇概要 变量名是以名字代表存储空间的一个内存地址 即存储单元 12 变量的名字必须符合C语言对标识符 identifier 的规定 标识符即一个对象的名字 标识符命名规则 1 合法性由大小写字母 数字字符 0 9 和下划线 组成 第1个字符必须为字母或下划线 用户定义的标识符不能和系统的关键字同名 2 有效性长度最好不超过32个字符 3 易读性大小写敏感 意义不同 应做到 见名知意 本节概要 本篇目录 例如 intday sum 0 合法 int3 day M D John 非法 intlin 1 2 合法 inta b c a b c 5 合法 2 2常量与变量 13 1 整型常量 有三种形式 十进制 如 34 128八进制 以0开头的数 如 045 023十六进制 以0 x开头的数 如 0 x7B 0X1a需要注意的是 整型常量中的长整型 long 要以L或小写字母l作结尾如 3276878L 496L整型常量中的无符号型 unsigned 要以U或u作结尾如 2100U 6u 本篇概要 2 3整型数据 2 整型变量 有六种形式 见教材表2 1 有符号基本整型 signed int无符号基本整型unsignedint有符号短整型 signed short int 32768 32767 无符号短整型unsignedshort int 0 65535 有符号长整型 signed long int 无符号长整型unsignedlong int 若干类型数据存储空间的大小查询 includevoidmain printf d d d n sizeof int sizeof short sizeof long 14 1 浮点型 实数 常量 有两种形式 十进制形式 由整数部分和小数部分组成 注意必须有小数点 如123 0 123 0 123 123指数形式 如1 23e9或1 23E9 都表示1 23 109 注意 字母e 或E 之前必须有数字 且字母e 或E 后面的指数必须为整数 例如 e3 3 1e6 5 e3 e等都是不合法的指数形式 一个浮点数在用指数形式输出时 是按规范化的指数形式输出的 例如 5689 65按指数形式输出的形式是5 68965e 003 即小数点左边必须且只能有一位非零的数字 本篇概要 2 4浮点型数据 15 2 浮点型变量 有三种类型 单精度 float 型占4字节 有效位数7位双精度 double 型占8字节 有效位数15 16位长双精度 longdouble 型例如 本篇概要 2 4浮点型数据 Example c includevoidmain floata doubles a 3 14 s 3 123456789012e12 printf a f s f n a s 16 1 字符常量字符常量是用单引号括起来的一个字符 仅占1个字节 如 A g D 字符常量可以参与常用的算术运算 例如 intb a 3 结果b为100 这是因为将 a 的ASCII码值97参与运算 本篇概要 2 5字符型数据 2 转义字符关于 开头的特殊形式的字符常量 转义字符 注意转义字符的1 3位八进制数和1 2位十六进制数的表示方式 例如 Example2 5 c 转义字符的使用 includevoidmain printf 101 x41 101 101 n 运行结果 A A A 101 17 4 字符串常量用双引号括起来的字符序列 至少占用2个字节 在字符串常量的结尾 系统自动加上字符 0 其ASCII码值为0 空操作字符 即什么也不做 作为字符串结束标志 所以 a 不等于 a a 的长度是2个字符 即 a 和 0 本篇概要 2 5字符型数据 3 字符变量字符变量的定义及赋值 例如 charc1 c2 c1 a c2 b 18 2 6算术运算符与算术表达式 一 算术运算符 两个整数相除的结果为整数而舍去小数部分 多数机器采取 向零取整 的方法 例如 5 3 1 5 3 1 而不是 2 问 2 5 7 3 int 2 5 4 7 2 4表达式的值 注意 求余运算符两侧均应为整型数据 本篇概要 若除数和被除数中有一个是浮点数 则进行浮点数除法 结果是浮点型 例如 5 3 0 1 66667 5 0 3 1 66667注意比较 1 3 3结果为01 0 3 3结果近似于1问 float 2 3 2 int 3 5 int 2 5 表达式的值 注意 求余运算符两侧均应为整型数据 19 2 6算术运算符与算术表达式 二 增1 减1 运算符 i i在使用i之前 先使i的值加 减 1i i 在使用i之后 使i的值加 减 1例如 若i的原值为3 则j i j的值为4j i j的值为3 然后i变为4 本篇概要 说明 1 增1 减1 运算符 只能用于变量 而不能用于常量或表达式 2 和 的结合方向是 自右至左 例如 i 相当于 i 20 2 7不同类型数据间的转换 1 自动转换先转换 后运算 系统将运算符两边不同类型的数据自动转换成同一类型 再进行运算 转换的规则 图中横向向左的箭头表示必定的转换 纵向的箭头表示当运算对象为不同类型时转换的方向 本篇概要 2 强制转换 例如 int x y 将x y的值转换为整型 int x y 将x转换为整型 得到一个中间变量 再与y相加 x的原类型未变 float 5 3 将5 3的值转换为float型 21 2 8逗号运算符和逗号表达式 逗号表达式的一般形式为 逗号运算符又称为 顺序求值运算符 求解过程是 从左至右顺序求解各表达式的值 而整个表达式的值为 表达式n 的值 逗号运算符是所有运算符中级别最低的 示例 a 3 5 a 4整个表达式值为60 a值为15 a 3 5 a 4 a 5整个表达式值为20 a值为15x a 3 6 3 整个表达式是赋值表达式 其值为18 x值为18 a值为3x a 3 6 a整个表达式是逗号表达式 值为18 x a值均为3 本篇概要 22 最简单的C程序设计 顺序程序设计 第三章 程序的三种基本结构C语句概述赋值表达式与赋值语句字符数据的输入输出基本 标准 输入输出顺序结构程序设计示例 23 3 1程序的三种基本结构 三种基本结构的程序控制流程图 它们的共同特征 单入口和单出口 从整体上看 都相当于一个执行处理框 本篇概要 24 3 2C语句概述 C语句的控制语句if else 条件语句for 循环语句 当型 while 循环语句 当型 do while 循环语句 直到型 至少执行一次 continue结束本次循环语句break中止执行switch或循环语句switch多分支选择语句return从函数返回语句 并可带回一个返回值 本篇概要 25 3 3赋值表达式与赋值语句 一 赋值运算符 和赋值表达式1 赋值运算符的结合方向为 从右至左 如 a b 5相当于a b 5 本篇概要 2 复合的赋值运算符 在赋值符 之前加上其它运算符构成复合赋值运算符 相当于变量的自加 自减等操作 例如 a 3等价于a a 3x y 8等价于x x y 8 x 3等价于x x 3 二 变量赋初值既可以用赋值语句实现 也可以在定义变量的同时使变量初始化 inta b a b 3 指定a b为整型变量 赋值为3 floatf 3 56 指定f为浮点型变量 初值为3 56 charc a 指定c为字符型变量 初值为 a 26 3 4字符数据的输入输出 用putchar函数输出一个字符格式 putchar c 说明 函数的作用就是向输出设备输出一个字符 用getchar函数输入一个字符格式 getchar 说明 此函数没有参数 函数的值就是从输入设备得到一个字符 本篇概要 例3 4 输入 输出单个字符 includevoidmain charc c getchar 从键盘输入一个字符 送到字符变量c putchar c putchar n 换行 27 3 5格式输入与输出 scanf 格式控制 地址表列 printf 格式控制 输出表列 可以输入 输出多个任意类型的数据 本篇概要 Example c 字符数组的输入输出 includevoidmain inti charstr1 10 str2 5 scanf s str1 数组名即代表数组首元素地址for i 0 i 5 i scanf c Example c 结构体中的输入输出 成员引用 includevoidmain structstudent 声明一个结构体类型数据 intnum charname 20 定义成员变量 stu 1 定义结构体变量scanf d s 引用成员用数组首元素地址方式 Example c 结构体中的输入输出 成员引用 includevoidmain structstudent 声明一个结构体类型数据 intnum charname 20 定义成员变量 stu 1 定义结构体变量scanf d s 引用成员用数组名方式 数组名代表首元素地址 28 选择结构程序设计 第四章 关于算法条件判断if语句实现的选择结构switch语句实现多分支选择结构程序举例 29 4 2条件判断 一 关系运算符和关系表达式 相等于 不等于 前4种运算符的优先级相同且高于后面的2种 例如 a b c等效于 a b c a b c等效于a b c a bc等效于a b c 赋值表达式f a b c等效于f a b c 关系运算符的结合方向是 自左至右 本篇概要 二 逻辑运算符和逻辑表达式逻辑非 逻辑与 逻辑或 优先级依次从高到低 说明 1 关系运算 逻辑运算的结果一定是 1 TRUE真 或0 FALSE假 2 逻辑运算符两侧的运算量可以是任意数据类型 判断一个量是否为 真 的处理方法是 非0为 真 0值为 假 例如 a 3的结果是 30 4 3用if语句实现选择结构 一 if语句结构的三种形式 本篇概要 Example c if 3 表达式为整型printf O K n if a 表达式为字符型printf d n a if 0 5 表达式为实型printf realdata n 说明 if后面的类型可以是任意数值类型 包括整型 实型 字符型 指针型数据 例如 if 表达式1 语句1elseif 表达式2 语句2elseif 表达式3 语句3 elseif 表达式m 语句melse语句n if 表达式 内嵌语句1 else 内嵌语句2 if 表达式 内嵌语句 31 4 3用if语句实现选择结构 四 if语句的嵌套 本篇概要 if if 语句1else语句2elseif 语句3else语句4 说明 注意if与else的配对关系 else总是与它上面最近的if配对 32 4 3用if语句实现选择结构 五 条件运算符和条件表达式表达式1 表达式2 表达式3求解过程 先求解 表达式1 若为非0 真 则取 表达式2 的值 若为0 假 则取 表达式3 的值例如 z x y x y 求较大数 等同于 本篇概要 if x y z x elsez y 当被判别的表达式的值为 真 或 假 时都去执行一个赋值语句且向同一个变量赋值时 可以用一个条件运算符来处理 33 4 3用if语句实现选择结构 注意 实际应用中 条件运算符可以嵌套使用 例 若要求学生成绩 90 等级用 A 表示 成绩在60 89之间 等级用 B 表示 成绩在60以下 等级用 C 表示 用条件运算符和条件表达式完成 本篇概要 Example c includevoidmain intscore chargrade scanf d 34 4 4用switch语句实现多分支选择结构 switch多分支选择语句的一般形式 本篇概要 switch 表达式 case常量表达式1 语句1case常量表达式2 语句2 case常量表达式n 语句ndefault 语句n 1 说明 switch后面的允许为任何数据类型 1 当switch后面表达式的值与某个case后面的常量表达式的值相等时 就执行此case后面的语句 若所有的case中的常量表达式的值都没有与之相等的 则执行default后面的语句 2 执行完一个case后面的语句后 流程控制转移到下一个case继续执行 为实现switch结构的多分支选择 应注意合理使用break语句使程序流程跳出switch结构 35 4 4用switch语句实现多分支选择结构 例 打印考试成绩的 等级 按分数段 includevoidmain floatscore chargrade printf 请输入学生成绩 scanf f 本篇概要 36 循环结构程序设计 第五章 循环的概念while循环for循环循环的嵌套Break语句和continue语句 37 5 2while循环控制 2 do 循环体语句 while 表达式 本篇概要 说明 1 do while可以转换为while循环 2 当while 表达式 的第一次的值非0时 两种循环得到的结果相同 否则两者结果不同 因为 3 do while循环先执行一次循环体语句 然后判别 表达式 的值非0 真 返回重新执行循环体语句 直到 表达式 值等于0 假 循环结束 注意此处有分号 1 while 表达式 循环体语句 38 5 3for循环控制 for 表达式1 表达式2 表达式3 循环体语句 本篇概要 for语句的执行流程 39 5 5用break和contiune语句改变循环状态 含break continue语句的循环结构的执行流程 1 在while语句中 用流程图表示 本篇概要 40 5 5用break和contiune语句改变循环状态 2 在for语句中 用伪代码式表示 本篇概要 for 表达式1 表达式2 表达式3 break for语句的下一语句 真 for 表达式1 表达式2 表达式3 continue for语句的下一语句 真 41 例5 6 把100 200之间不能被3整除的数输出 本篇概要 5 5用break和contiune语句改变循环状态 42 5 6程序设计示例 例5 8 循环嵌套使用 求100 200之间的全部素数 本篇概要 include includevoidmain intm i k n 0 for m 101 m k 1 printf d m n n 1 if n 10 0 printf n 每行输出10个数 printf n 43 5 6程序设计示例 习题5 2 输入一行字符 分别统计出其中的英文字母 空格 数字和其它字符的个数 本篇概要 includevoidmain charc intletters 0 space 0 digit 0 other 0 printf 请输入一行字符 n while c getchar n 判断从键盘接受字符 if c a include include 字符处理函数头文件voidmain charc intupletters 0 lwletters 0 space 0 digit 0 other 0 printf 请输入一行字符 n while c getchar n 判断从键盘接受字符 if isupper c upletters elseif islower c lwletters elseif isspace c space elseif isdigit c digit elseother printf d n d n d n d n d n upletters lwletters space digit other 44 5 6程序设计示例 习题5 6 输出所有的 水仙花数 本篇概要 includevoidmain inti j k n printf parcissusnumbersare for n 100 n 1000 n i n 100 求百位数j n 10 i 10 求十位数k n 10 求个位数if n i i i j j j k k k printf d n printf n 45 数组 第六章 数组的概念数组的定义和引用字符数组和字符串处理函数 46 6 2一维数组 1 定义一维数组 类型数组名 常量表达式 2 引用一维数组 数组名 下标 注意数组下标从0开始 且引用的元素下标值不要超过数组定义的范围 本篇概要 例如 inta 10 定义数组中有10个元素是 a 0 a 9 而不要引用a 10 3 数组的赋值定义的同时赋初值 通过一对花括号 实现 例如 inta 6 0 1 2 3 4 5 或写成inta 0 1 2 3 4 5 定义数组后的赋值 按引用数组的方式进行a 0 66 a 1 80 a 2 33 47 6 3二维数组 1 定义二维数组类型数组名 常量表达式 常量表达式 本篇概要 说明 数组下标的行号和列号均从0开始 例如 inta 3 4 定义数组a中有3 4个元素是 a 0 0 a 2 3 2 引用二维数组数组名 下标 下标 例如 a 0 1 56 引用数组并对其赋值 掌握数组赋值的方法 可在定义的同时赋初值 也可在定义之后赋值 48 6 3二维数组 本篇概要 3 二维数组的初始化1 对部分数组元素赋初值 例如 inta 2 3 0 6 其余的元素系统自动赋0值 2 对全部数组元素赋初值 例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 3 按行对全部数组元素赋初值 例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 4 对二维及多维数组元素赋初值时 其第一维的长度可以不指定 但其它各维的长度不能省 例如 inta 3 1 2 3 4 5 6 等价于inta 2 3 1 2 3 4 5 6 inta 3 0 3 5 等价于inta 2 3 0 3 0 5 0 0 49 6 4字符数组 字符数组中的一个元素存放一个字符 字符型与整型互相通用 注意 字符型数组的每个元素只占一个字节的内存空间 本篇概要 一 字符数组的定义例如 charc 7 定义一个字符数组c 0 H c 1 o c 2 w c 3 c 4 y c 5 o c 6 u 给各元素赋值赋值以后的数组状态如下图所示 注意区分 空格 与 空字符 0 空格 的ASCII码为32 而 空字符 的ASCII码为0 50 二 字符数组的初始化 可以在定义字符数组时进行初始化 例如 charc 6 H e l l o 或charc H e l l o 本篇概要 如果提供的初值个数小于数组长度 则这些字符只赋给前面的元素 其余元素系统自动定为空字符 即 0 例如 charc 8 H e l l o 51 四 字符串和字符串结束标志 1 字符串结束标志 0 1 凡字符串常量 系统自动加一个 空字符 0 作为结束符 例如 Hello 在内存中的存放 本篇概要 2 区分 字符数组的长度 与 字符串的长度 字符串的长度 是以 0 结束 但不包括 0 的字符串的实际长度 例如 charc 10 Hello 其中 字符数组的长度 10 字符串的长度 6 2 用字符串常量对字符数组初始化 例如 charc Hello 或charc Hello 或charc H e l l o 0 以上三种方式是等价的 注意其中的字符串结束标志 0 52 五 字符数组的输入输出 可以用两种方式 逐个字符输入输出 用 c 将整个字符串一次输入或输出 用 s 注意 1 输出字符不包括结束符 0 2 如果一个字符数组包含一个以上的 0 则遇到第一个 0 时输出就结束 本篇概要 例如 includevoidmain chara 12 I a m a b o y 0 charb China chary 10 inti scanf s y 数组名代表首元素地址printf s s s n a b y 按字符串输出for i 0 i 0 i printf c a i 按数组元素逐个字符输出printf n 53 六 字符串处理函数 在string h中gets 从终端输入一个字符串到字符数组 对比 通过scanf 函数的 s格式输入时 空格是作为字符串之间的分隔符 本篇概要 strcpy 字符串拷贝 可用于对字符数组重新赋值 strcat 字符串连接strcmp 字符串比较 按ASCII码值大小比较 strlen 求字符串的实际长度strlwr 将字符串中的大写字母转换成小写字母strupr 将字符串中的小写字母转换成大写字母 includevoidmain chara 20 printf inputarray scanf s a printf s n a 只有空格前的字符输出 includevoidmain chara 20 printf inputarray gets a 可以包含空格printf s n a 输出遇 0 前的所有字符 54 七 数组应用举例 习题6 2 用选择法对10个整数排序 可以与第8章的例8 9选择法排序对比起来看 本篇概要 选择法排序 includevoidmain inti j min temp a 11 printf enterdata n for i 1 ia j min j 把小的位置记下来并赋给mintemp a i a i a min a min temp 执行内容交换 printf nThesortednumbers n for i 1 i 10 i printf 5d a i 排序后输出printf n 55 七 数组应用举例 习题6 4 将一个数插入到已排好序的数组中 本篇概要 includevoidmain inta 11 1 4 6 9 13 16 19 28 40 100 inttemp1 temp2 number end i j for i 0 iend a 10 number 如果输入的数大于end 就把这个数放最后else for i 0 inumber temp1 a i a i number for j i 1 j 11 j temp2 a j a j temp1 temp1 temp2 break printf Nowarraya n for i 0 i 11 i printf 5d a i printf n 56 函数调用 第七章 函数概述函数的定义和调用函数的参数和函数的值函数的递归调用变量的作用域变量的存储类别 57 7 2函数的定义 函数定义的一般形式为 类型标识符函数名 形式参数表列 声明部分语句部分 本篇概要 说明 1 如果缺少 形式参数表列 则为无参函数定义 即此函数在调用时不需要参数 2 如果缺少函数体部分 则为空函数定义 即此函数调用时不起任何作用 没有任何功能 只是在此占一个程序位置 intmax intx inty intz 函数体中的声明部分z x y x y return z 函数体 无参函数定义 voidprint message printf Howdoyoudo n voidmerge 空函数定义 58 函数调用既可以出现在表达式可出现的任何地方 也可以以函数调用语句独立出现 7 3函数的调用 函数调用的一般形式 函数名 实际参数表列 本篇概要 函数 引用性 声明 或称 函数原型 函数类型函数名 形式参数表列 当被调用函数的定义出现在当前函数之后 则必须在当前函数中 先声明 后使用 说明 函数原型的两种形式为 函数类型函数名 参数类型1参数名1 函数类型函数名 参数类型1 参数类型2 includevoidmain intmax int int 函数原型inta b c scanf d d 59 函数的应用 习题7 3 写一个判断素数的函数 本篇概要 includeintprime intn intflag 1 i for i 2 i n 2 60 函数的应用 习题7 7 写一个函数 将一个字符串中的元音字母复制到另一字符串 然后输出 本篇概要 includevoidmain voidcpy char char 函数声明 函数原型 charstr 80 cstr 80 printf inputstring gets str cpy str cstr printf Thevowellettersare s n cstr voidcpy chars charc 函数定义 函数首部 inti j for i 0 j 0 s i 0 i if s i a s i A s i e s i E s i i s i I s i o s i O s i u s i U c j s i j c j 0 61 7 7变量的作用域 局部变量与全局变量 局部变量只能在本函数或分程序的范围内有效 作用域 全局变量是定义在函数之外的变量 它的有效范围是 从定义该变量的位置开始到本源程序文件结束 局部变量局部有效 全局变量 全局 有效 而当全局变量与局部变量同名或内层变量与外层变量同名时 局部优先于全局 内层优先于外层 本篇概要 62 7 8变量的存储方式和生存期 一 变量的存储方式 生存期 静态存储动态存储 本篇概要 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式 而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式 数据分别存放在静态存储区和动态存储区 而全局变量全部存放在静态存储区中 内存中供用户使用的存储空间可以分为三部分 程序区静态存储区动态存储区 二 变量的存储类别自动变量 auto 函数调用结束即释放静态变量 static 程序运行期间不释放 63 7 8变量的存储方式和生存期 例7 16 考察静态局部变量的值 注意 静态变量如果不赋初值 则系统自动赋初值为0 本篇概要 includevoidmain intf int 函数原型 inta 2 i for i 0 i 3 i 将先后3次调用f函数 printf d n f a 每调用1次 a重新赋初值为2 intf inta 函数定义 autointb 0 staticc 3 函数调用结束后 变量不释放 b b 1 c c 1 函数调用结束后 c为当前值 return a b c 注 静态变量如果不赋初值 则系统自动赋初值为0 运行结果为789 64 指针 第八章 地址和指针的概念变量的指针和指向变量的指针变量指针与数组指针与字符串动态内存分配和指向它的指针变量指针小结 65 8 2变量的指针和指向变量的指针变量 即 下面两个语句作用相同 i 3 将3赋给i i pointer 3 将3赋给指针变量所指向的变量i 本篇概要 指针变量用来指向另一个变量 指针 即 地址 即存放变量的第一个字节的地址 如变量i的指针为2000指针变量 存放地址的变量 如i pointer 为了表示指针变量和它所指向的变量之间的联系 在C中用 号表示指向 例如 i pointer是一个指针变量 而 i pointer表示i pointer所指向的变量i 66 8 2 1怎样定义指针变量 怎样使一个指针变量指向另一个变量呢 只需要把被指向的变量的地址赋给指针变量即可 例如 inti j int pointer 1 pointer 2 pointer 1 本篇概要 指针变量的定义格式 基类型 指针变量名 例如 int p1 float p2 char p3 67 8 2 2怎样引用指针变量 有两个与指针变量有关的运算符 1 取地址运算符 2 指针运算符 或称间接访问运算符 本篇概要 例如 i为变量i的地址 pointer 1为指针变量pointer 1所指向的存储单元的内容 在引用指针变量时 可能有三种情况 1 给指针变量赋值p 68 8 2 2怎样引用指针变量 例8 2 输入a和b两个整数 按先大后小的顺序输出a和b 本篇概要 includevoidmain int p1 p2 p a b scanf d d 69 8 2 3指针变量作为函数参数 习题8 1 对输入的3个整数按由小到大小顺序输出 本篇概要 includevoidmain voidswap int p1 int p2 intn1 n2 n3 int p1 p2 p3 printf inputthreeintegern1 n2 n3 scanf d d d 70 8 2 3指针变量作为函数参数 例8 3 对输入的两个整数按大小顺序输出 要求用函数处理 而且用指针变量作为函数参数 程序如下 本篇概要 includevoidmain voidswap int p1 int p2 inta b int pointer 1 pointer 2 scanf d d 运行结果 45 78 max 78 min 45 71 8 3通过指针引用数组 一 数组元素的指针可以用一个指针变量指向一个数组元素 inta 10 定义 为包含10个整型数据的数组int p 定义 为指向整型变量的指针变量p 使p指向a 5 元素 问 当前若有p 3应指向哪个元素 问题 下面的两个语句等价吗 p 注意 如果数组为int型 则指针变量的基类型亦应为int型 数组名代表的是数组的起始地址 请判断下面程序的输出结果 includevoidmain inta 10 1 2 3 4 5 6 7 8 9 10 p a printf d d d n p 4 a 4 a 4 运行结果 555 72 二 指针的运算例如 指针变量p指向数组元素a 0 对于指针变量p的自增运算p 表示p指向下一个元素a 1 即数组元素的下标加1 对于p的自减运算p 表示p指向前一个元素 例如 int p 则p 2指向a 2 元素 本篇概要 8 3通过指针引用数组 注意 执行p 是加一个数组元素所占用的字节数 例如 VC 6 0中 有 inta 3 1 2 3 p p 2 则p 代表的地址增量是4个字节 p i等价于a i 73 例8 通过指针变量输出 数组的10个元素 有人编写出以下程序 includevoidmain int p i a 10 p a for i 0 i 10 i scanf d p for i 0 i 10 i p printf d p printf n 运行结果 1234567890 02215312345113003625202116318259823728483 includevoidmain int p i a 10 p a for i 0 i 10 i scanf d p p a for i 0 i 10 i p printf d p printf n 解决这个问题的办法 只要在第二个for循环之前加一个赋值语句 8 3通过指针引用数组 74 判断程序执行后的输出结果 includevoidmain inti p b 2 4 6 8 10 12 14 p b 4 printf d p printf d d d n p p 2 b 4 for i 0 i 7 i printf d b i 使用指针变量指向数组元素时注意 3 指向数组的指针变量也可以带下标 如p i C程序在编译时对其下标的处理方法是转换为地址的 将p i 处理成 p i 即取p的当前值 i后所指向的元素的值 若当前p指向a 3 则p 2 代表a 3 2 即a 5 4 利用指针引用数组元素 注意某些常用的书写形式 p 相当于 p 作用是先引用 再使p自增1 p 相当于 p 作用是先引用 再使p自减1 p相当于 p 作用是先使p自增1 再引用 p 引用后使p指向的元素值加1 不是指针值加1 8 3通过指针引用数组 75 四 用数组名作函数参数例如 voidmain intf intarr intn 函数原型intarray 10 f array 10 实参数组名代表其首元素地址 voidf intarr intn 形参arr应是接收地址的 8 3通过指针引用数组 说明 f intarr intn 在编译时 系统是将形参数组arr按指针变量处理的 形参接收的是实参传递的首元素地址 相当于将函数f的首部写成f int arr intn 以上两种写法是等价的 76 归纳起来 函数的实参与形参的对应关系有以下 种情况 实际上 C编译系统都是将形参数组名作为指针变量来处理的 例如 f intarr intn f int arr intn 以上两种形参的写法是等价的 8 3通过指针引用数组 对上面表格中的4种形式 下面通过例 例8 9 做详细介绍 根本上 它们都是地址量 其调用方式 由实参将地址传递给形参 77 例8 9 用选择法对10个整数按由大到小顺序排序 includevoidmain voidsort intx intn inta 10 i printf enterarray n for i 0 i 10 i scanf d 形参x为数组名voidsort intx intn inti j k t for i 0 ix k k j if k i t x i x i x k x k t 形参x为指针变量voidsort int p intn inti j k t for i 0 i p k k j if k i t p i p i p k p k t 78 例8 9 用选择法对10个整数按由大到小顺序排序 includevoidmain voidsort intx intn inti p a 10 p a for i 0 i 10 i scanf d p p a sort p 10 实参为指针变量 形参可以是数组或指针变量for p a i 0 i 10 i printf d p p printf n 形参x为数组名voidsort intx intn inti j k t for i 0 ix k k j if k i t x i x i x k x k t 形参x为指针变量voidsort int p intn inti j k t for i 0 i p k k j if k i t p i p i p k p k t 79 一 字符串的表示形式C程序中 访问一个字符串可以用两种方法 用字符数组存放一个字符串 然后输出该字符串用字符指针指向一个字符串 例如 chara CLanguage char p CLanguage printf s n s n a p 本篇概要 8 4通过指针引用字符串 注意二者的概念是不同的 前者定义的数组a中存放了一个字符串 后者定义的字符指针变量p 其含义是使p指向字符串的起始地址 不能理解为是将字符串赋给p或是赋给 p 80 二 字符指针作函数参数 本篇概要 8 4通过指针引用字符串 例8 18用函数调用实现字符串的复制 形参用字符指针变量 includevoidmain voidcopy string char from char to char a Iamateacher charb Youareastudent char p b printf a s n b s n a p printf copystringatostringb n copy string a p 实参传递的是地址printf na s n b s n a b voidcopy string char from char to for from 0 from to to from to 0 81 三 对使用字符指针变量和字符数组的讨论用字符数组和字符指针变量都能实现字符串的存储和运算 但它们二者之间是有区别的 主要有以下几点 1 字符数组由若干个元素组成 每个元素中放一个字符 而字符指针变量中存放的是地址 字符串第1个字符的地址 绝不是将字符串放到字符指针变量中 2 赋值方式 对字符数组只能对各个元素赋值 不能用以下办法对字符数组赋值 charstr 14 定义字符数组str IloveChina 不能对字符数组整体赋值但可以在定义时 charstr 14 loveChina 本篇概要 8 4通过指针引用字符串 而对字符指针变量 可以采用下面方法赋值 char a 定义字符指针变量a IloveChina 可对字符指针变量赋值但注意赋给指针变量 的不是字符 而是字符串第一个字符的地址 82 char loveChina 对字符指针变量赋初值等价于以下两条语句 char 定义字符指针 loveChina 可以对字符指针变量赋值而对数组的初始化 charstr 14 loveChina 可在定义时赋初值不能等价于下面的两条语句 charstr 14 定义字符数组str loveChina 不能对数组整体赋值 只能逐个元素赋值 本篇概要 8 4通过指针引用字符串 3 对字符指针变量赋初值 83 4 如果定义了一个字符数组 在编译时为它分配内存单元 它有确定的地址 而定义一个字符指针变量时 给指针变量分配内存单元 在其中可以放一个字符变量的地址 即 该指针变量可以指向一个字符型数据 但如果未对它赋予一个地址 则它并未具体指向一个确定的字符数据 本篇概要 8 4通过指针引用字符串 例如 charstr 10 定义数组scanf str 这样是可以的而常有人用下面的方法 目的是想输入一个字符串 虽然一般也能运行 但这种方法是危险的 char 定义指针变量scanf s 危险的操作 正确的应当这样 char str 10 a str 赋首地址scanf s a 84 5 指针变量的值是可以改变的 例如 本篇概要 8 4通过指针引用字符串 includevoidmain char p IloveChina p指向了首字符p p 7 printf s n p 例8 19改变指针变量的值 说明 s格式符可通过字符数组名或字符指针变量输出一个字符串 例如 printf s n a 其中的a可以是一个字符数组名或字符指针变量名 注意 对一个数值型数组 则不能企图用上面的数组名形式输出它的全部元素 而只能逐个元素输出 85 6 也可以用下标形式引用字符指针变量所指的字符串中的字符 例如 对前面的 例8 19 本篇概要 8 4通过指针引用字符串 includevoidmain char p IloveChina p指向了首字符inti printf Thesixthcharacteris c n p 5 for i 0 p i 0 i printf c p i 用下标形式逐个字符输出printf n 86 用户建立的数据类型 第九章 结构体共用体类型枚举类型用typedef命名类型 87 9 1结构体类型和结构体变量 声明一个结构体类型的一般形式为 struct结构体名 成员表列 本篇概要 结构体名 类型名 成员名 例如 structstudent intnum charname 20 charsex intage floatscore c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论