![C语言高级编程实践.ppt_第1页](http://file1.renrendoc.com/fileroot2/2020-1/20/1e101f4d-54cf-4bc4-a829-52b638dfae2c/1e101f4d-54cf-4bc4-a829-52b638dfae2c1.gif)
![C语言高级编程实践.ppt_第2页](http://file1.renrendoc.com/fileroot2/2020-1/20/1e101f4d-54cf-4bc4-a829-52b638dfae2c/1e101f4d-54cf-4bc4-a829-52b638dfae2c2.gif)
![C语言高级编程实践.ppt_第3页](http://file1.renrendoc.com/fileroot2/2020-1/20/1e101f4d-54cf-4bc4-a829-52b638dfae2c/1e101f4d-54cf-4bc4-a829-52b638dfae2c3.gif)
![C语言高级编程实践.ppt_第4页](http://file1.renrendoc.com/fileroot2/2020-1/20/1e101f4d-54cf-4bc4-a829-52b638dfae2c/1e101f4d-54cf-4bc4-a829-52b638dfae2c4.gif)
![C语言高级编程实践.ppt_第5页](http://file1.renrendoc.com/fileroot2/2020-1/20/1e101f4d-54cf-4bc4-a829-52b638dfae2c/1e101f4d-54cf-4bc4-a829-52b638dfae2c5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、上章回顾,宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法,C语言编程实践,第二章,预习检查,异或的运算符是什么 宏定义最主要的特点是什么 请列举条件编译三大用法 在文件包含中 和“” 有什么区别 如何取得整数register中的第五位值,本章结构,指针特性,C语言编程实践,C语言常犯错误,C语言关键词,C语言编程调试,C语言编程要点,位段,位运算,课程目标,了解位运算的实际应用。 了解C语言几个重要关键词的特性和他们之间区别 熟悉C语言编程要点 熟悉C语言常见的语法错误以及解决方法 了解如何去定位错误以及解决错误,2 C语言编程实践,位运算 指针特
2、性 C语言关键词 C语言几个以混淆的概念 C语言编程易犯毛病集合,2.1 位运算,按位与运算 按位或运算 按位异或运算 求反运算 左移运算 右移运算,2.1 位运算,位运算符的含义 位运算是指进行二进制位的运算。 功能: c语言提供对内存单元的二进制位的操作,使得c语言能够编写系统软件. 位运算符 运算对象只能为整型或字符型数据. 各个位运算符号的使用:,2.1.1按位与运算,按位与 printf(Input a integer number: ); scanf(%d, ,程序运行情况: Input a integer number:1000 result=0 x3 程序说明: ( 0 p =
3、 p-sizeof(int)。,2.3.2 函数指针,数据指针的三个问题 C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针; 调用函数实际上等同于“调转指令参数传递处理回归位置入栈”,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器; 因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以调用一个根本就不存在的函数实体。,2.3.2 函数指针,数据指针实例 /* 定义一个无参数、无返回类型的 */ typedef void (*lpFunction) ( ); /* 函数指针类型 */ /*定义一个函数指针,指向*
4、/ lpFunction lpReset = (lpFunction)0 xF000FFF0; /* CPU启动后所执行第一条指令的位置 */ lpReset(); /* 调用函数 */,2.3.3 数组与动态申请,动态申请内存方式可以用较大的数组替换 尽可能的选用数组,数组不能越界访问; 如果使用动态申请,则申请后一定要判断是否申请成功了,并且malloc和free应成对出现!,2.4 C语言关键词,const typedef 与define define 与 enum static,2.4.1 const,const -只读 说说以下的区别 const int a; int const a
5、; const int *a; int * const a; int const * a const; const的优势 关键字const的作用是为给读你代码的人传达非常有用的信息 防止便利被无意的代码修改,2.4.1 const,const -只读 说说以下的区别 const int a; int const a; const int *a; int * const a; int const * a const; Const的优势 关键字const的作用是为给读你代码的人传达非常有用的信息 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码 防止便利被无意的代码修改,2.
6、4.2 typedef 与define,#define 预处理指令 在编译预处理时进行简单的替换, 不作正确性检查 不需要再在内存中分配变量空间 调试程序无法检查用#define说明的常量 用#under指令取消 typedef 声明一个新的类型名代替已有的类型名 在编译时处理的 不实际分配内存空间,2.4.2 typedef 与define,#define实例 #define your_int int * your_int a, b; 结果 相当于int *a, b; 只是简单的宏替换 即 int *a; int b;,typedef例子 typedef int * your_int; yo
7、ur_int a, b 结果 /a, b 都为指向int的指针 即 int *a; int *b;,2.4.3 define 与 enum,#enum 特点 用enum关键字说明的常量由编译程序自动生成,程序员不需要用手工对常量一一赋值。 用enum关键字说明常量使程序更清晰易读,因为在定义enum常量的同时也定义了一个枚举类型标识符。 在调试程序时通常可以检查枚举常量。 需要分配内存来存储常量,2.4.3 define 与 enum,#enum 例子 enum Error_Code OUT_OF_MEMORY, INSUFFICIENT_DISK_SPACE, LOGIC_ERROR, FI
8、LE_NOT_FOUND ;,2.4.3 define 与 enum,#enum 相对#define的优势 使程序更容易维护 使程序更易读 使程序调试起来更方便,2.4.4 static,static的特点 本地的全局变量 限制变量的作用域 设置变量的存储域 static 的作用 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,2.5 C语言编程要点,C语言存储空间布局 Heap与stack static特
9、性应用 字符串常量 array_name和 extern int n; int main() n = 20; printf(%dn,n); display(); return 0; ,static int n; /*定义全局静态变量,自动初始化为0,仅在本文件中可见*/ void display() n+; printf(%dn,n); ,结果: 文件分别编译通过,但link的时候teststatic1.c中的变量n找不到定义,2.5.3.1全局静态变量,优势 不会被其他文件所访问,修改 其他文件中可以使用相同名字的变量,不会发生冲突。 静态局部变量和普通局部变量的区别 static局部变量只
10、被初始化一次,下一次依据上一次结果值; static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝,2.5.3.2 局部静态变量,定义 局部变量之前加上关键字static 。 特征 内存中的位置:静态存储区 初始化:未经初始化的全局静态变量会被程序自动初始化为0 作用域:作用域仍为局部作用域 特征 局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。 全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围,2.5.3.3 静态函数,定义 在函数的返回类型前加上关键字static 特性 只是在声明他的文件当中可见,不能被其他文件所用 优势 其他文件中可以定义相同名
11、字的函数,不会发生冲突 静态函数不能被其他文件所用,2.5.3.3 静态函数,实例分析:,/teststatic2.c,teststatic1.c,void display(); static void staticdis(); int main() display(); staticdis(); renturn 0; ,void display() staticdis(); printf(display() has been called n); static void staticdis() printf(staticdis() has been calledn); ,结果: 文件分别编译
12、通过,但是连接的时候找不到函数staticdis()的定义,2.5.3.4 statics实例,例:统计次数功能,void count(); int main() int i; for (i = 1; i = 3; i+) count(); return 0; void count() static num = 0; num+; printf(I have been called %d,num,timesn); ,结果: I have been called 1 times. I have been called 2 times. I have been called 3 times.,2.5
13、.4 array_name和 char *p = a; /*运行下面这句后, vc6.0 提示的错误为:cannot convert from char (*)5 to char *, ,结果: 1245044 1245040 abcd abcd,2.5.4 array_name和 int i,j; a=65535; i=-1; j=a; b=i; printf(unsigned)%u(int)%dn,a,j); printf(int)%d(unsigned)%un,i,b); ,结果: (unsigned)65535(int)-1 (int)-1(unsigned)65535,2.5.5 强
14、制数据类型转换的总结,转换规则,double float 高 long unsigned Int char,short 低,说明: 横向箭头表示必须的转换 纵向箭头表示当运算符两边的运算数为不同类型时的转换 低高 形式上改变, 数据的实质内容 不变 高低 可能有些数据丢失,2.5.5 强制数据类型转换的总结,转换规则 把赋值运算符右侧表达式的类型转换为左侧变量的类型 转换细节 浮点型与整型 单、双精度浮点型 char型与int型 int型与1ong型 无符号整数,阶段小节,常见的位运算符有哪些 什么是数据指针 如何定义一个函数指针 const有那些特点,主要应用在哪些方面 static主要有几
15、种用法,各自特点是什么 C强制数据类型转化要注意哪些方面,2.6 C语言编程易犯毛病集合,书写标识符时,忽略了大小写字母的区别 忽略了变量的类型,进行了不合法的运算 将字符常量与字符串常量混淆 忽略了“=”与“=”的区别 忘记加分号 多加分号 输入字符的格式与要求不一致 switch语句中漏写break语句 忽视了while和do-while语句在细节上的区别 定义数组时误用变量,2.6.1书写标识符时,忽略了大小写字母的区别,分析 注意:C认为大写字母和小写字母是两个不同的字符,main() int a=5; printf(%d,A); ,2.6.2 忽略了变量的类型,进行了不合法的运算,分
16、析 注意:整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算,main() float a,b; printf(%d,a%b); ,2.6.3 将字符常量与字符串常量混淆,分析 char c; c= a; 注意: 字符常量是由一对单引号括起来的单个字符 字符串常量是一对双引号括起来的字符序列 以“”作字符串结束标志,2.6.3 将字符常量与字符串常量混淆,分析 char c; c= a; 注意: 字符常量是由一对单引号括起来的单个字符 字符串常量是一对双引号括起来的字符序列 以“”作字符串结束标志,2.6.4 忽略了“=”与“=”的区别,分析 if (a=3) a=b; if
17、(a=3) a=b; 注意: “=”是赋值运算符 “=”是关系运算符,2.6.5 忘记加分号,分析, a=1 b=2 z=x+y; t=z/100; printf(%f,t); ,2.6.6 多加分号,分析 注意: 复合语句的花括号后不应再加分号 for (I=0;Iy?x:y; return(z); ,注意 形参应该在函数体外定义 局部变量应该在函数体内定义,2.6.13 误认为形参值的改变会影响实参的值,语句分析,语句改正,main () int x=3,y=4; swap(x,y); printf (%d,%d,x,y); int swap (int x,int y) int z; z=
18、x;x=y;y=z; ,main () int x=3,y=4; int *p1,*p2; p1= ,注意 实参和形参之间单向传递,2.6.14 函数的实参和形参类型不一致,语句分析,错误分析 C 要求实参与形参的类型一致 P1 -指针参数 P1 - 整形参数,main () int x=3,y=4; int *P1,*p2; P1= ,2.7 C语言的调试,如果我运行的程序挂起了,应该怎么办 如何检测内存漏洞(leak) 调试程序的最好方法是什么 怎样调试TSR程序 能报告条件失败的程序,2.7.1如果我运行的程序挂起了,应该怎么办,程序挂起的四大原因 程序中有死循环; 程序运行的时间比所期
19、望的长; 程序在等待某些输入信息,并且直到输入正确后才会继续运行; 程序设计的目的就是为了延迟一段时间,或者暂停执行。,2.7.1.1死循环,什么死循环 有几张情况可以造成死循环 分析例子: 解决方式 增加对应的调试debug信息,/* initialize a double dimension array */ for (a = 0 ; a 10; +a ) for(b = 0; b10; +a) arrayab=0; ,2.7.1.2 运行时间比期望的时间长,什么时候回出现这种情况 该如何消除 分析例子: /* A subroutine to calculate Fibonacci num
20、bers */ int fib ( int i) if (i 3) return 1; else return fib( i - 1)+fib( i - 2); 解决方式 熟悉基本的语法或者算法运算信息,2.7.1.3 等待正确的输入,原因是:等待正确的输入信息 分析例子:,# include main() FILE *in = fopen(numbers.dat, r); int total = 0, n; while( fscanf( in, %d , ,2.7.2 如何检测内存漏洞(leak),什么是内存漏洞 动态分配的内存单元不再使用却没有被释放 什么情况会容易出现这样的问题 忘记释放
21、分配给临时缓冲区的内存空间 内存漏洞特点 最难检测 最危险,2.7.2 如何检测内存漏洞(leak),例子分析,void SayHi( char *name ) char * UpName; int a; UpName = malloc( strlen( name ) +1); / * Allocate space for the name * / for( a =0; astrlen( name ); +a) UpNamea = toupper( namea) ; UpName a = 0; printf(Hello, %sin, UpName ); int main() SayHi( Da
22、ve ); return( 0 ); ,2.7.2 如何检测内存漏洞(leak),解决方案 小心谨慎地编写程序,充分考虑到内存漏洞的可能性 malloc和free要配对 使用相应的软件包 利用语言的扩展功能,2.7.3调试程序的最好方法是什么,调试过程的三个要素 应该用什么工具调试一个程序? 用什么办法才能找出程序中的错误? 怎样才能从一开始就避免错误?,2.7.3.1应该用什么工具调试一个程序,调试工具功能 观察程序的运行情况 设置断点 设置监视,2.7.3.2 用什么办法才能找出程序中的错误,先调试程序中较小的组成部分,然后调试较大的组成部分 彻底调试好程序的一个组成部分后,再调试下一个组
23、成部分 连续地观察程序流(flow)和数据的变化 始终打开编译程序警告选项 并试图消除所有警告 准确地缩小存在错误的范围,2.7.3.3 如何从一开始就避免错误,程序中应有足够的注释 函数应当简洁 程序流应该清晰,避免使用goto语句和其它跳转语句 函数名和变量名应具有描述性,2.7.4 能报告条件失败的程序,assert()命令 打印失败条件的内容; 打印发生错误的行号; 打印错误所在的源文件名; 使程序以出错状态结束。 NDEBUG宏定义,2.7.4 能报告条件失败的程序,assert()例子,foo() char * buffer; buffer = malloc( 10000 ); assert ( buffer |= NULL ); float IntFrac(int Num, int Denom ) assert( Denom ! = 0 )
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人租房合同的(31篇)
- 2024-2025学年北京市房山区高一上学期期中考试历史试卷
- 2025年公共设施配套建设项目房屋征收合同
- 2025年住宅销售策划合同模板规定
- 2025年官方离婚协议范本策划(双方同意版)
- 2025年全球贸易合同制定原则及合规要求解析
- 2025年债权转让与贷款合作协议
- 2025年车辆所有权变更策划协议书模板
- 2025年农村土地利用合作协议
- 2025年人事档案授权委托协议
- 山西省国土空间规划(2020—2035年)
- 【青岛版《科学》】四年级下册第一单元1 《运动与力》 教学设计
- 加气站安全管理(最新)精选PPT课件
- 47《心经》图解PPT课件(50页PPT)
- 污水管线铺设施工工艺方法
- 维修保运车间岗位职责
- 液碱生产工序及生产流程叙述
- 三年级学生《成长记录》模板
- 好书推荐——《三毛流浪记》
- 方菱F2100B中文系统说明书
- 人教版动手动脑学物理答案 八下
评论
0/150
提交评论