




已阅读5页,还剩93页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言学习指导 一 数据类型 运算符和表达式二 语句三 函数四 指针与数组五 字符串与数组六 结构体与链表 一 数据类型 运算符和表达式 在C程序中出现的任何数据 变量 常量 都必须显式地或隐含地为其指定数据类型数据类型反映计算机数据以下几方面的内涵 数据值的特征 整数 实数等 数据在计算机内的编码方式数据占内存空间的大小和数据取值范围对数据可以施加哪些运算 一 数据类型 运算符和表达式 常用的数据类型 基本类型如 int short long char double float数组类型如 float 10 int 3 5 char 2 3 4 指针类型如 int double 空类型void结构体类型struct上述类型的组合如 结构体的指针数组 structstudent 5 一 数据类型 运算符和表达式 先定义 后使用 的原则C程序中 任何对象 变量 数组 函数等 都要先经过定义或者声明 方可使用 编译器第1次遇到一个新的标识符时 一定是在定义或声明的场合 之后再次遇到它 就已经 认识 它了 一 数据类型 运算符和表达式 在对标识符做定义或声明时 会遇到下面几种符号的组合使用 用来构成指针 用来构成数组 1 改变组合的优先次序 2 构成函数组合时还要注意这几种符号的优先级举例 int p1 5 int p2 5 int p3 函数原型 p3是函数名int p4 p4是指针变量名int p5 3 p5是数组名 存放3个函数指针 一 数据类型 运算符和表达式 运算符的3个属性 都要记忆 优先级结合方向左结合 右结合右结合规则的运算符有 赋值运算符单目运算符 不含后缀 三目运算符 运算对象操作数的个数 单目 双目 三目 和操作数的数据类型比如 指针运算符 需要1指针型的操作数下标运算符 需要2个操作数 一个指针型 一个整型 一 数据类型 运算符和表达式 包含多个运算符的表达式的计算次序1 按优先级由高到低2 优先级相同的情况下按结合方向左结合 先左后右 右结合 先右后左 3 注意 改变计算的先后次序doublea 10 p a p p p p p p sizeofsizeof p sizeof int p 编译错 一 数据类型 运算符和表达式 表达式的概念表达式表示了一个计算过程 变量是表达式常量是表达式函数调用是表达式由运算符将表达式组合起来的式子是表达式用圆括号 将表达式括起来的式子是表达式 一 数据类型 运算符和表达式 表达式有值和数据类型两个属性表达式的值 表达式的计算结果值表达式的数据类型 结果值的数据类型doublea 10 0 p b p表达式p的值是变量a的指针 类型是double 表达式 p的值是10 0 类型是double表达式b p的值是10 类型是short a p表达式 a的值是变量a的地址 类型是double 表达式p的值是变量a的地址 类型是double 表达式 a p的值是1 类型是int 一 数据类型 运算符和表达式 源程序中字面值 常量 的几种形式整数常量例子 13 1 0 123类型是int字符常量例子 A n 012 x2e 类型是int浮点数常量0 0 3 56 3e1类型是double字符串常量例子 a d b f n 一 数据类型 运算符和表达式 源程序中字面值 常量 的几种形式整数常量例子 13 1 0 123类型是int字符常量例子 A n 012 x2e 类型是int浮点数常量0 0 3 56 3e1类型是double字符串常量例子 a d b f n 浮点数字面值的书写方法由4部分组成 整数部分 小数部分指数部分书写规则 指数部分和小数点不能同时省略 整数部分和小数部分不能同时省略 如果含有指数部分 则e或E的前边和后边都必须有数字 且后边只能是整数 表示10的某次方 一 数据类型 运算符和表达式 浮点数字面值的书写方法举例小数形式的例子12 3 123123 0 0070 0指数形式的例子123 4e 5 代表123 4 10 5 2E21 2e 44 47E0错例 e1 12e 1 2e3 4 e5 e 一 数据类型 运算符和表达式 不同类型数据混合算术运算时的类型转换显式转换 强制类型转换 类型转换运算符 类型 隐式转换 自动类型转换 用双目算术运算符进行运算时 运算符的左 右操作数的类型必须相同 如果不同 编译器会试着将其转换成为相同的类型 然后才进行计算 如果这种自动类型转换不能实现 编译时会报错 在进行算术运算时 隐式类型转换总是朝表达数据能力更强的方向进行 并且转换总是逐个运算符进行的 一 数据类型 运算符和表达式 左值 leftvalue 的概念左值表达式具有存放数据的空间 并且存放总是被允许的 左值表达式能够作为赋值运算符的左操作数 左值表达式 表达式左操作数右操作数 和 运算符的操作数也必须是左值 一 数据类型 运算符和表达式 左值表达式举例inta b 10 p 错 C语言中赋值表达式不是左值 一 数据类型 运算符和表达式 一 数据类型 运算符和表达式二 语句三 函数四 指针与数组五 字符串与数组六 结构体与链表 C语句可以分为5类 控制语句函数调用语句表达式语句空语句复合语句 控制语句C语言有9种控制语句 if elseforwhiledo whilecontinueswitchreturnbreakgoto要熟练掌握每种语句的语法和用法 表达式语句形式 expression 在表达式的最后加一个分号注意表达式与表达式语句的差别举例 a 3是一个赋值表达式 值等于3a 3 是一个赋值表达式语句x 2是一个表达式x 2 是一条表达式语句 但无实际意义if a b 0 t a if a b 0 t a 函数调用语句形式 function 参数表 在函数调用表达式的后面加一个分号函数调用语句可以看作一种表达式语句举例 printf d i getchar max a b 空语句形式 只有一个分号 什么操作都不做用法 常用于语法上要求放一条语句但又 无事可做 的场合for i 1 sum 0 i 100 sum i 复合语句形式 语句序列 将一组语句用一对花括号 括起来复合语句中 语句序列可以包含任何形式的C语句 甚至其他复合语句 形成嵌套结构 在语法上 一个复合语句被当作一条语句来处理用法 用于需要把多条语句放在只允许使用一条语句的场合 复合语句注意 语句序列 右花括号后面不要加分号 如果右花括号的后面加了括号 语句序列 则这个分号将被视为1条空语句 复合语句和空语句加来共有2条语句 不能用在只允许使用1条语句的场合 一 数据类型 运算符和表达式二 语句三 函数四 指针与数组五 字符串与数组六 结构体与链表 关于函数的几个知识点函数的定义函数的返回和函数的返回值函数的参数函数的调用在函数内部定义的变量 函数的定义一般形式 函数类型 函数名 形式参数表 声明部分 语句 其中 函数类型 形式参数表 声明部分 语句都可以省略 所以最简单的形式是 函数名 空函数 关于函数定义的几点说明 1 函数类型 定义了函数返回值的类型 通过return语句返回 如果缺省 则返回类型为int如果不需要函数返回值 可用void来定义函数类型 2 形式参数表 类型名1参数1 类型名2参数2 3 声明部分 在此对函数体内的局部变量和函数原型 如有必要 进行声明 函数的返回 return语句return语句的作用 带回函数返回值结束函数执行 返回主调函数return语句的几种格式 return表达式 return 表达式 return 仅用于返回类型为void时 return语句可以在函数体内不出现或多次出现 没有return语句时 其返回值不确定 函数返回值的类型函数返回值的数据类型在函数定义时通过 函数类型 指定 当return语句中的表达式值的类型与 函数类型 不一致时 以 函数类型 为准 对于数值类型的表达式 将自动进行类型转换 对于非数值类型 在编译时当错误处理 函数返回值举例 intmax floata floatb return a b a b main floatx 2 6 y 1 8 z z max x y printf Maxis f z 输出 Maxis2 0 函数的参数 Arguments 形式参数 定义函数时被定义和使用的参数 简称形参 实际参数 调用函数时 取代形式参数的实际数据 简称实参 实参可以是常量 变量 表达式以及函数调用表达式等 当执行调用函数用实参去取代形参时 二者的类型必须相同或赋值兼容 参数的传递一个函数在未被调用之前 其形参不占存储单元 只有当函数被调用执行时 才为该函数的形参分配存储单元 当函数执行完毕时 释放其形参所占的存储单元 C语言中 实参与形参传递的方式是 值传递 即在函数调用时将实参的值装入对应形参的存储单元中 由于形参和对应的实参被放在不同的存储单元中 因此在执行函数调用的过程中 实参的值不会因形参值的改变而改变 在函数调用结束时 系统也不会用形参的值去修改实参存储单元里的值 可见 参数的传递是单向传值 形参和实参具有不同的存储空间 不同的生存期和不同的作用域 3 voidswap inta intb 交换两个变量 intc c a a b b c return main intx 3 y 4 swap x y 交换x和y printf x d y d n x y 输出 x 3 y 4 a b 4 x和y没并有发生交换 函数的调用函数可以被其他函数 称为主调函数 调用 被主调函数调用的函数称为被调函数 在主调函数中进行函数调用时 程序的执行从主调函数转入被调函数 执行被调函数的代码 被调函数执行完毕 程序的执行就返回到主调函数 执行主调函数中的剩余的代码 函数调用的执行过程为被调函数的形参分配空间 依次计算实参表达式的值 并将计算结果逐个赋给被调函数对应的形参 为被调函数内部定义的局部变量分配空间 执行被调函数的语句序列 被调函数执行完 遇到return或结束函数的 释放为被调函数分配的内存空间将函数值返回到函数调用处 继续执行主调函数中后面剩余代码 函数原型 Prototype 函数原型的一般形式 形式1 类型函数名 类型1 类型2 形式2 类型函数名 类型1形参1 类型2形参2 在函数原型中 参数的名称可有可无 但每个参数的类型必须有 函数的声明 Declaration 注意 在调用函数之前 应先对该函数进行声明函数声明用函数原型来表示 函数声明可以放在主调函数的声明部分 也可以放在主调函数的外面 如果函数声明被放在函数的外部 则对声明位置之后的所有主调函数都起作用 不需要在这些主调函数内再次声明 函数的定义也具有声明的作用 如果函数的定义放在该函数被调用之前 则调用这个函数时可以不作声明 库函数的声明被包含在头文件 h 里 不需在源程序里声明 一维数组名作为函数参数注意事项用一维数组名做函数的参数时 实参和形参都必须用数组名 或者用指针变量 形参数组名后要加 表示它是数组 方括号内的 数组长度 没有任何意义 可以缺省 一维数组的实参不要加 举例 main intsum int int 函数声明intx 5 1 2 3 4 5 i printf sum d sum x 5 数组名作为实参 intsum inta 100 intn 这里的100没任何意义 inti sum for i sum 0 i n i sum a i returnsum 二维数组名作为函数的参数二维数组做形参时必须指定第2维的长度 第1维的长度可以不指定 二维数组实参的第2维长度必须与形参相同 而第1维的长度不受形参的限制 上述规则也适用于其他高维数组 函数的嵌套调用主调函数调用了一个被调函数 被调函数还可以调用另外一个函数 形成嵌套调用关系 floatarea floatr 计算圆面积floata a 3 14 r r return a floatvol floatr floath 计算圆柱体体积floatv v area r h return v main floatr 4 h 4 v v vol r h printf V f n v main floatr h v r 3 h 4 v vol r h printf f v return0 floatvol r h floatr h floata v a area r v a h return v floatarea r floatr floata a 3 14 r r return a 函数的递归调用递归 函数直接或间接地调用它自身编写递归调用程序时要注意设计好递归的出口 否则会导致无限循环地调用 举例 计算factorial n n 1当n 1 0fac n n fac n 1 当n 1 fac 5 5 fac 4 intfac intn intf if n 1 return1 递归出口f n fac n 1 递归调自己returnf main intn scanf d n printf factorial d d n n fac n P 3 P 2 printf 3 P 2 P 2 P 1 printf 2 P 1 P 1 P 0 printf 1 P 0 P 0 return P 0 return P 1 P 0 printf 1 P 0 P 0 return P 0 return P 2 P 1 printf 2 P 1 voidP intw if w 0 return P w 1 printf d w P w 1 输出序列 1 2 1 3 1 2 1 举例 一个递归函数的执行过程 变量的作用域 变量的有效作用范围 一个变量只有在自己的作用域中才能被引用 局部变量和全局变量具有不同的作用域 变量的生存期 变量实际占有内存空间的期间 变量在生存期内才存在 变量的生存期不一定是整个程序的运行期间 局部变量 LocalVariables 局部变量 在一个函数内部或复合语句内部定义的变量 局部变量的作用范围就是本函数或本复合语句 函数的形参也属于局部变量 相当于用实参值进行了初始化的局部变量 不同函数中可以使用相同名字的局部变量 它们的作用域不同 是不同的变量 不会相互干扰 main函数中定义的变量也是局部变量 有效范围局限在main 的内部 局部变量有以下几种 自动变量寄存器变量静态局部变量形式参数 全局变量 GlobalVariables 全局变量 定义在函数体之外的变量 全局变量的作用域 自定义位置开始 一直到本源程序的结束 全局变量可以被自它定义位置以下的所有函数引用 如果某函数内有一个与全局变量同名的局部变量 则局部变量将屏蔽同名的全局变量 预处理命令 外部变量定义等inta 函数类型FUNC1 形参表 声明部分 执行语句部分 intb 1 函数类型main 形参表 声明部分 inta 执行语句部分 intc b 函数类型FUNCn 形参表 声明部分 执行语句部分 全局变量增加了函数之间传递数据的渠道 利用return语句只能传回一个返回值 当一个函数的计算结果多于一个时 可以借助全局变量来传递这些计算结果 但是全局变量的使用将降低程序的清晰性和通用性 因此 不要滥用全局变量 动态存储方式与静态存储方式动态存储方式 程序运行期间根据需要动态分配存储空间的方式 函数形参 自动变量等是按动态方式存储的变量当调用函数时 给该函数中的局部变量和形参分配存储空间 函数返回时立即释放它们所占的存储空间 静态存储方式 在整个程序运行期间分配固定存储空间的方式 全局变量 静态变量等是按静态方式存储的变量 内存中供用户使用的存储空间分为以下几个部分 程序区 静态存储区全局变量静态局部变量静态外部变量 动态存储区 堆heap 由用户动态申请 如 malloc 用户使用的内存区 常量区 栈 stack 形参 自动变量 程序区 用来存放程序的机器指令序列静态存储区 用来存放程序中的全局变量 静态局部变量和静态外部变量 这部分存储空间在程序开始运行时进行分配 在整个运行期间不会发生变化 栈区 stack 用来存放自动局部变量 形参 这部分存储空间在执行函数调用时进行分配 函数调用结束时回收 动态存储区 heap 程序运行时由用户动态申请和释放的存储空间 详见指针一章 变量的存储类别 任何变量都具有两大属性 1 数据类型 int double char等 2 存储类别 静态存储类 动态存储类等完整的变量定义形式 存储类别 数据类型变量名表列 变量的存储类别 根据存储类别 变量分为四类 1 自动变量auto 2 寄存器变量register 3 静态变量static 4 外部变量extern 自动变量 auto 局部变量的一种定义时用关键字auto作声明 auto可以省略 属于动态存储类 存放于动态存储区自动变量在函数调用时分配空间 函数执行结束时释放空间 复合语句中的自动变量在进入复合语句时分配空间 离开复合语句时释放空间intfunc inta intb autodoublex y z 0 0 inti j k i j k也是自动变量 寄存器变量 register 局部变量的一种 定义时用关键字register作声明 存放在CPU的寄存器中 存取数度快 仅限字符型和整型属于动态存储类 动态分配寄存器 func1 intn registerinti for i 0 i 20000 i 静态局部变量 static 局部变量的一种 定义时用关键字static作声明 属于静态存储类 存放在静态存储区 其存储空间在整个程序运行期间都不释放 其值不会丢失 如果多次调用含有静态局部变量x的函数 第1次调用时x的起始值是被初始化的值 以后的每次调用x的起始值是上一次调用结束时x的值 静态局部变量 续 在函数调用结束后 静态局部变量虽仍然存在 但已经不在它的作用域内 所以其他函数不能引用它 静态局部变量在编译时赋初值 且只赋一次 若不对静态局部变量赋初值 则编译时将其初值赋为0 而如果不对auto变量赋初值 其初值为无意义的未知数据 静态局部变量举例 intTestStatic void staticinta 0 autointb 0 a b return a b main inti for i 1 i 3 i printf d TestStatic 输出 234 用extern声明外部变量 1 1 在单个源程序文件内声明外部变量外部变量 定义在函数之外的变量 全局变量 声明外部变量格式 extern 类型 变量名 作用 拓展全局变量的作用域 使得全局变量可以先使用 后定义 虽然一个全局变量只能定义一次 但它的外部声明可以多次出现 预处理命令 外部变量定义等externb c 函数类型FUNC1 形参表 externa b c 声明部分 执行语句部分 函数类型main 形参表 声明部分 执行语句部分 inta b c 函数类型FUNCn 形参表 声明部分 执行语句部分 举例 intmax intx inty returnx y x y main externA B extern声明外部变量 A B printf d max A B 在定义之前使用外部变量 intA 13 B 8 在此定义外部变量 输出 14 用extern声明外部变量 2 2 在多个源程序文件中声明外部变量下面的讨论是针对一个C程序由多个源程序文件组成的情形 如果希望在多个文件中使用同一个外部变量 可以在某一个文件中定义这个外部变量 而在其他文件中用extern声明它 这样extern将一个外部变量的作用域拓展到多个文件中 举例 一个C程序由file1 c和file2 c两个文件组成 file1 c intmax int int main intc externintA B 声明c max A B printf c d c file2 c intmax inta intb returna b a b externintA 3 B 5 定义 总结1 关于变量的定义和声明变量的声明 Declaration 对变量的某些属性加以界定如用static auto register对局部变量存储类别加以界定 注意 它们只能在定义变量时声明 用extern和static对外部变量作用域加以界定对一个变量的声明可以重复出现 变量的定义 Definition 确定变量的数据类型 并为其分配存储空间对一个变量的定义不能重复 定义有声明的功效 而声明不一定有定义的功效 总结2 关于变量的作用域局部变量 限制在函数 复合语句 内自动变量auto寄存器变量register形式参数静态局部变量static全局变量 文件范围静态外部变量 只限本文件引用 非静态外部变量 允许其他文件引用 总结3 关于变量的生存期生存期 变量占有存储单元的期间动态存储 自动变量 当函数被调用时存在 寄存器变量 当函数被调用时存在 形式参数 当函数被调用时存在 静态存储静态局部变量 整个程序运行期间都存在 静态外部变量 整个程序运行期间都存在 非静态外部变量 整个程序运行期间都存在 一 数据类型 运算符和表达式二 语句三 函数四 指针与数组五 字符串与数组六 结构体与链表 指针变量的定义格式 基类型 指针变量名 指针的基类型 简称类型 就是指针所指向对象的数据类型 举例 float fp fp是指向float型变量的指针int ip ip是指向int型变量的指针double dp dp是指向double型变量的指针 在对标识符做定义或声明时 会遇到下面几种符号的组合使用 用来构成指针 用来构成数组 1 改变组合的优先次序 2 构成函数组合时还要注意这几种符号的优先级举例 int p1 5 int p2 5 int p3 函数原型 p3是函数名int p4 p4是指针变量名int p5 3 p5是数组名 存放3个函数指针 一个指针变量 在没有给它初始化或赋值之前 指针变量的值是一个未知数据 俗称 野指针 如果引用野指针 编译时不会出错 但会导致运行错误 甚至可能导致很危险的错误 注意哦 定义一个指针变量时 只为存放指针的值分配了存储空间 并没有为它所指向的数据对象分配空间 main int p i p 35 此刻p没有指向任何对象 35放在哪里呢 p 35放入变量i的空间 与指针相关的运算符 之一 取地址运算符 指针运算符 自增运算符 自减运算符 加法运算符 减法运算符 关系运算符 逻辑运算符 与指针相关的运算符 之二 取地址运算符 用来获取变量的地址单目算符 右结合 优先级高 的操作数可以是变量 数组元素 结构体成员等指针运算符 用来引用指针所指向的内存块中的数据单目算符 右结合 优先级高 的操作数是指针型的对象 与指针相关的运算符 之三 注 以下介绍的指针运算符通常针对指向数组元素的指针自增运算符 p 将使得指针p向高位移动一个数据的长度自减运算符 p 将指针p向低位移动一个数据的长度 一个数据 的字节数取决于指针的基类型 即 一个数据的长度 sizeof p的基类型 如 float p p 将使得指针p向高位移动4字节 与指针相关的运算符 之四 加法运算符 p p n n 0 将使指针p向高位移动n个数据长度减法运算符 p p n n 0 将使指针p向低位移动n个数据长度p q结果是一个整数 表示两个指针之间的相隔的元素个数关系运算符 比较指针所指位置的先后 指针作为函数的参数举例voidswap int x int y intt t x x y y t main inta 5 b 9 int pa 输出 a 9 b 5 5 9 a b a b 指向数组的指针 定义格式 类型 标识符 数组长度 举例 double p 5 指针p可以用来指向长度为5的double型数组doublex 5 y 3 5 p p 指向数组的指针 定义格式 类型 变量名 数组长度 举例 double p 5 指针p可以用来指向长度为5的double型数组doublex 5 y 3 5 p 解读short p 4 将p定义为一个指针变量 指向一个包含4个元素的short型一维数组 基类型是short 4 注意 p两侧的圆括
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 特殊句式和情景交际(讲义)-2024年高考英语一轮复习(新高考)
- 碳、硅及无机非金属材料(复习讲义)-2026年高考化学一轮复习(福建专用)原卷版
- 上海市杨浦区2024-2025学年七年级(下)期末语文试卷(五四学制)解析版
- 人教版八年级英语下册专练:单项选择专练100题(含答案)
- 人教版八年级英语下册重点语法过关:现在完成时(含答案)
- 2021年1月国开电大法学本科《国际法》期末纸质考试试题及答案
- 配镜专业科普知识培训内容课件
- 2025版铁投劳务分包合同实施标准
- 2025年森林资源培育与承包山林合作协议
- 2025年度兼职软件测试人员聘用合同示范
- 2025年职工职业技能竞赛(制图员赛项)参考试题库(含答案)
- 胖东来管理制度
- 学校教育用地土地租赁合同
- 乳腺癌图文课件版
- 大学意识形态安全教育
- 原材料不合格预防措施
- 高压氧护理进修汇报
- 中国神经病理性疼痛诊疗指南(2024版)解读
- 2024年微信小程序开发与代运营合同
- 2024国有企业与私营企业之间的混合所有制改革合作协议
- 【电气施工】工业厂房机电安装工程施工组织设计方案
评论
0/150
提交评论