




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 运算符及其优先级运算符及其优先级 优先级优先级运算符运算符名称或含义名称或含义使用形式使用形式结合方向结合方向 优先级优先级 运算符运算符名称或含义名称或含义使用形式使用形式结合方向结合方向 数组下标数组名 常量表达式 等于表达式 表达式 圆括号 表达式 函数名 形参表 7 不等于表达式 表达式 左到右 成员选择 对象 对象 成员名 8 在数组指针的定义中 圆括号是不能少的 否则它是指针数组 int a 3 4 p a 开始时 p 指向二维数组第 0 行 当进行 p 1 运算时 根据地址运算规则 此时放大因子为 4x4 16 所以此时正 好指向二维数组的第 1 行 和二维数组元素地址计算的规则一样 p 1 指向 a 0 1 p i j 则指向数组元素 a i j 四 指针数组四 指针数组 因为指针是变量 因此可设想用指向同一数据类型的指针来构成一个数组 这就是指针数组 数组中的每个元 素都是指针变量 根据数组的定义 指针数组中每个元素都为指向同一数据类型的指针 格式 类型标识 数组名 整型常量表达式 例如 int a 10 以上指针数组中包含 10 个指针变量 a 0 a 1 a 2 a 9 可以指向 10 个不同的地址 3 指针函数和函数指针指针函数和函数指针 一 指针函数一 指针函数 指针函数是指声明其返回值为一个指针的函数 实际上就是返回一个地址给调用函数 格式 类型说明符 函数名 参数 例如 void GetDate int ID 二 函数指针二 函数指针 指向函数的指针包含了函数的地址 可以通过它来调用函数 格式 类型说明符 函数名 参数 例如 int fptr int ID 其实这里不能称为函数名 应该叫做指针的变量名 这个特殊的指针指向一个返回整型值的函数 指针的声明 笔削和它指向函数的声明保持一致 指针名和指针运算符外面的括号改变了默认的运算符优先级 如果没有圆括号 就变成了一个返回整型指针的函数的原型声明 可以采用下面的形式定义函数指针数据类型 typedef int T MY FUNC int ID 此时 T MY FUNC fptr 等价于 int fptr int ID 可以采用下面的形式把函数的地址赋值给函数指针 fptr 或用 fptr Function 可以采用下面的形式通过指针来调用函数 fptr ID 或用 fptr ID 的格式 使用这种调用格式看上去与调用普通函数无异 因此 使用前一种调用格式可以明确指出是通过指针而非函数名来调用函数的 三 指针的指针三 指针的指针 指针的指针用于指向指针的地址 它的声明有两个星号 例如 char cp 如果有三个星号 那就是指针的指针的指针 有四个星号那就是指针的指针的指针的指针 依次类推 四 指向指针数组的指针四 指向指针数组的指针 指针的指针另一用法是处理指针数组 有些程序员喜欢用指针数组来代替多维数组 一个常见的用法就是处理 字符串 char Names Bill Sam Jim 0 main char nm Names 定义一个指向指针数组的指针的指针 while nm 0 printf s n nm 4 可变参数的函数可变参数的函数 下面是一个简单的可变参数的函数 该函数至少有一个整数参数 第二个参数也是整数 是可选的 include void simple va fun int i va list arg ptr int j 0 va start arg ptr i va 在这里是可变参数 variable argument 的意思 j va arg arg ptr int va end arg ptr printf d d n i j return 从这个函数的实现可以看到 使用可变参数应该有以下步骤 1 include 2 在函数里定义一个 va list 型的变量 这里是 arg ptr 这个变量是指向参数的指针 3 用 va start 宏初始化变量 arg ptr 该宏的第二个参数是第一个可变参数的前一参数 是一固定的参 数 4 用 va arg 返回可变的参数 并赋值给 j va arg 的第二个参数是要返回的参数的类型 这里是 int 型 5 最后用 va end 宏结束可变参数的获取 下面的例子可以进一步加深对可变参数的理解 该函数的效果与 sprintf 函数完全相同 void my printf char buffer const char format va list arg ptr va start arg ptr format vsprintf buffer format arg ptr 将 arg ptr 按 format 格式打印到 buffer 中 va end arg ptr 位域的使用位域的使用 位域的定义和位域变量的说明与结构定义相仿 其形式例如为 struct bs int a 8 int b 2 int 2 无位域名 该 2bit 不能使用 int c 4 对于位域的定义尚有以下几点说明 1 一个位域必须存储在同一个字节中 不能跨两个字节 如一个字节所剩空间不够存放另一位域时 应从下 一单元起存放该位域 也可以有意使某位域从下一单元开始 5 2 由于位域不允许跨两个字节 因此位域的长度不能大于一个字节的长度 也就是说不能超过 8 位二进位 3 位域可以无位域名 这时它只用来作填充或调整位置 无名的位域是不能使用的 链链 表表 typedef struct student int number int score struct student next STUDENT LINK 建立一个有 cnt 个结点的链表 返回链表头 STUDENT LINK link creat int cnt STUDENT LINK head NULL head 始终指向链表头 用于返回 STUDENT LINK new node new node 始终指向新申请的节点 STUDENT LINK cur node cur node 始终指向当前操作的 也是最后的 节点 int n 1 while n next new node cur node new node 让 cur node 始终指向当前的 也是最后的 节点 cur node next NULL 不要忘记让最后的节点的 next 指向 NULL n return head 删除链表中 number 字段为 num 的结点 并返回链表头 STUDENT LINK link delete STUDENT LINK head int num STUDENT LINK cur node cur node 始终指向当前操作的节点 STUDENT LINK pre node pre node 始终指向当前操作的节点的上一个节点 if head NULL 6 printf 这个链表是空的 请先建立一个链表 n return head cur node head while cur node number num cur node cur node next 将 cur node 向后移一个结点 if cur node number num 在链表中找到了要删除的结点 if cur node head 要删除的是头结点 head cur node next else pre node next cur node next free cur node printf 学号为 d 的节点已经从链表中删除 n num else 在链表中没有找到要删除的结点 printf 您想要删除的结点不在此链表中 n return head 插入一个新结点到链表的最后 并返回链表头 STUDENT LINK link insert STUDENT LINK head STUDENT LINK node STUDENT LINK cur node cur node 始终指向当前操作的节点 if head NULL head node else cur node head while cur node next NULL cur node cur node next 将 cur node 向后移一个结点 7 cur node next node node next NULL 不要忘记让最后的节点的 next 指向 NULL printf 这个节点已经插入当前链表的最后 n return head 用户输入一个节点 void link input STUDENT LINK node 输出一个链表 void link output STUDENT LINK head STUDENT LINK cur node int cnt 0 cur node head printf ID t 学号 t t 分数 n while cur node NULL printf d t d t t d n cnt cur node number cur node score cur node cur node next printf 合计有 d 条记录 n cnt 链表接口调用范例 void link main void STUDENT LINK new list NULL STUDENT LINK new stud 要插入的新结点 int cnt 5 int num 100 new list link creat cnt printf 您创建的列表为 n link output new list new list link delete new list num printf 删除结点后的列表为 n link output new list link input new list link insert new list printf 插入新结点后的列表为 n 8 link output new list 预处理预处理 一 预处理过程和预处理指令一 预处理过程和预处理指令 在 C 语言中 并没有任何内在的机制来完成如下一些功能 在编译时包含其他源文件 定义宏 根据条件决定 编译时是否包含某些代码 要完成这些工作 就需要使用预处理程序 尽管在目前绝大多数编译器都包含了预处理 程序 但通常认为它们是独立于编译器的 预处理过程读入源代码 检查包含预处理指令的语句和宏定义 并对源 代码进行响应的转换 预处理过程还会删除程序中的注释和多余的空白字符 下面是部分预处理指令 指令 用途指令 用途 空指令 无任何效果 include 包含一个源代码文件 if 如果给定条件为真 则编译下面代码 define 定义宏 ifdef 如果宏已经定义 则编译下面代码 undef 取消已定义的宏 ifndef 如果宏没有定义 则编译下面代码 elif 如果前面的 if 给定条件不为真 且当前条件为真 则编译下面代码 else 如果前面的 if 给定条件不为真 则编译 else 下面的代码 endif 结束一个 if else 条件编译块 二 预定义的宏名二 预定义的宏名 ANSI 标准说明了五个预定义的宏名 它们是 LINE 当前语句所在的行号 FILE 当前语句所在文件的文件名 DATE 该宏指令含有形式为 月 日 年 的串 表示源代码翻译到目标代码的日期 TIME 该宏指令含有形式为 时 分 秒 的串 表示源代码翻译到目标代码的时间 STDC 如果实现是标准的 则该宏含有十进制常量 1 如果它含有任何其它数 则表示实现是非标准的 注 如果编译不是标准的 则可能仅支持以上宏名中的几个 或都不支持 但也许还提供其它预定义的宏名 三 三 运算符运算符 的功能是将其后面的宏参数进行字符串化操作 Stringfication 简单说就是在对它所引用的宏变量通过替 换后在其左右各加上一个双引号 有时把这种用法的 称为字符串化运算符 比如 define WARN IF EXP if EXP fprintf stderr Warning EXP n 那么语句 WARN IF divider 0 将被替换为 if divider 0 fprintf stderr Warning divider 0 n 会打印出 Warning divider 0 再比如 define PASTE n adhfkj n printf s n PASTE 15 宏定义中的 运算符告诉预处理程序 把源代码中任何传递给该宏的参 数转换成一个字符串 所以输出应该是 adhfkj15 四 四 运算符运算符 被称为连接符 concatenator 运算符用于把参数连接到一起 预处理程序把出现在 两侧的参数合并成 一个符号 先看一个简单的例子 define NUM a b c a b c define STR a b c a b c 前后可以加空格 printf d n NUM 1 2 3 9 printf s n STR aa bb cc 最后程序的输出为 123 aabbcc 再比如要做一个菜单项命令名和函数指针组成的结构体的数组 并且希望在函数名和菜单项命令名之间有直观 的 名字上的关系 那么下面的代码就非常实用 struct command char name 菜单项命令名 void function void 命令名对应的函数指针 define COMMAND NAME NAME NAME command struct command my commands COMMAND quit 相当于 quit quit command COMMAND help 相当于 help help command 五 五 error error 指令指令 error 指令用于程序的调试 当编译中遇到 error 指令就停止编译 并显示相应的出错信息 error 命令的基本形式为 error 出错信息 六 六 line line 指令指令 命令 line 主要用于调试及其它特殊应用 line 改变 LINE 与 FILE 的内容 它们是在编译程序中预先定 义的标识符 line 命令的基本形式为 line number filename 其中的数字为任何正整数 可选的文件名为任意有效文件标识符 行号为源程序中当前行号 文件名为源文件 的名字 例如 下面的行计数从 100 开始 printf 语句输出为 102 因为它是语句 line 100 后的第 3 行 line 100 初始化行计数器 main 行号 100 行号 101 printf d n line 行号 102 七 七 pragma pragma 指令指令 在所有的预处理指令中 pragma 指令可能是最复杂的了 它的作用是设定编译器的状态或者是指示编译器完 成一些特定的动作 pragma 指令对每个编译器给出了一个方法 在保持与 C 和 C 语言完全兼容的情况下 给出主 机或操作系统专有的特征 依据定义 编译指示是机器或操作系统专有的 且对于每个编译器都是不同的 其格式一般为 pragma para 其中 para 为参数 下面来看一些常用的参数 pragma message X86 macro activated 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来 这对于源代码信息的控制是非常重要的 当我们在程序中定义了许多宏来控制源代码版本的时候 我们自己有可能都会忘记有没有正确的设置这些宏 此时我们可以用这条指令在编译的时候就进行检查 pragma code seg section name section class 它能够设置程序中函数代码存放的代码段 当我们开发驱动程序的时候就会使用到它 pragma once 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次 这条指令实际上在 VC6 中就已经有了 但 是考虑到兼容性并没有太多的使用它 10 pragma hdrstop 表示预编译头文件到此为止 后面的头文件不进行预编译 BCB 可以预编译头文件以加快链接的速度 但如果 所有头文件都进行预编译又可能占太多磁盘空间 所以使用这个选项排除一些头文件 pragma startup 有时单元之间有依赖关系 比如单元 A 依赖单元 B 所以单元 B 要先于单元 A 编译 可以用 pragma startup 指 定编译优先级 如果使用了 pragma package smart init BCB 就会根据优先级的大小先后编译 pragma resource dfm 表示把 dfm 文件中的资源加入工程 dfm 中包括窗体外观的定义 pragma warning disable 4507 34 once 4385 error 164 pragma warning disable 4507 34 once 4385 error 164 等价于 pragma warning disable 4507 34 不显示 4507 和 34 号警告信息 pragma warning once 4385 4385 号警告信息仅报告一次 pragma warning error 164 把 164 号警告信息作为一个错误 同时这个 pragma warning 也支持如下格式 pragma warning push n pragma warning pop 这里 n 代表一个警告等级 1 4 pragma warning push 保存所有警告信息的现有的警告状态 pragma warning push n 保存所有警告信息的现有的警告状态 并且把全局警告等级设定为 n pragma warning pop 向栈中弹出最后一个警告信息 取消在入栈和出栈之间所作的一切改动 pragma argsused 如果没有在函数内部使用某个参数 编译时会报告 Parameter name is never used in function func name 使用 pragma argsused 编译时就不再警告了 VC 不支持这条指令 pragma pack pragma pack n C 编译器将按照 n 个字节对齐 n 必须是 1 2 4 8 16 32 64 等值 pragma pack 取消自定义字节对齐方式 pragma pack 规定的对齐长度 实际使用的规则是 结构 联合 或者类的数据成员 第一个放在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新质生产力与碳汇
- 出行安全培训班课件
- 初级导游人员资格考试(全国导游基础知识、地方导游基础知识)练习试题及答案(吉林2025年)
- 社交互动影响转化-洞察及研究
- 2025年新版妇产科三基考试试题及答案
- (2025)国家公务员录用考试行测常识题库及答案
- 金属回收循环经济研究-洞察及研究
- 艾滋病防治知识竞赛题库及答案
- 出口流程课件
- 2025【合同范本】停车位物业管理合同
- (2025秋新版)教科版三年级上册科学全册教案
- 2025年新西师大版数学三年级上册全册课件
- 食品安全总监、食品安全员考核考试测试题及答案
- 2025年彩票市场监察笔试备考手册
- 培训学校租房合同协议书
- 第8课 西溪湿地教学设计-2025-2026学年小学地方、校本课程浙教版(2021)人·自然·社会
- 江淮十校2026届高三第一次联考物理试卷(含答案解析)
- 网络货运行业知识培训课件
- 《从“浪浪山”启程做更好的“小妖怪”!》开学第一课班会教案
- 1.8《天气的影响》教学设计-教科版三上科学(新教材)
- 防地震教学课件
评论
0/150
提交评论