软件研究室培训C语言.ppt

上传人:za****8 文档编号:15496769 上传时间:2020-08-13 格式:PPT 页数:40 大小:414.52KB
收藏 版权申诉 举报 下载
软件研究室培训C语言.ppt_第1页
第1页 / 共40页
软件研究室培训C语言.ppt_第2页
第2页 / 共40页
软件研究室培训C语言.ppt_第3页
第3页 / 共40页
资源描述:

《软件研究室培训C语言.ppt》由会员分享,可在线阅读,更多相关《软件研究室培训C语言.ppt(40页珍藏版)》请在装配图网上搜索。

1、C语言,主要内容,一、 学习编程语言的一些建议 二、 指针 三、 预处理器 四、 结构、联合和枚举 五、 sizeof 六、 参考书籍和资料,(1)多动手 学习编程唯一方法是编写调试程序。看再多的书,效果也比不上设计调试一个简单程序。 (2)养成良好的编程习惯 养成好习惯很难。所以良好的编程习惯要从一开始培养。 (3)注意细节 不应漏过任何一个技术细节。只有细节的日积月累,才能有技术上的提高。 (4)了解开发环境 在学习编程语言的同时,也需要了解编程语言的开发、使用环境。如硬件平台(51、MSP430、PC)、操作系统(uCOS、Linux、DOS)、集成开发环境(Keil C,Borland

2、 C)等。 (5)多看书、勤思考 很多国外的经典书籍是由拥有几十年经验的质深程序员编写的。这些书里最重要的是融入了作者多年的编程经验。多看书,再结合自身平时的积累,不断思考总结是提高编程技术最有效的办法。,第一章 学习编程语言的一些建议,第二章 指 针,2.1 指针的基本概念 2.1.1 指针是什么? 指针是一个变量,它的值是另外一个变量的地址。 例1,2.1.2 指针的类型 指针所存储的那个变量类型,就称为指针的类型。 例 2 有三个不同类型的指针: int I2, *pI = ,2.1.3 指针的三个要素 指针指向的地址(指针的内容); 指针指向的地址上的内容; 指针本身的地址。 例 3:

3、 int A, *pA, *ppA; pA = 在复杂的指针都可以通过下表来分析: p = a; /等价于 p =,但数组不同于指针: 数组名 a是指向数组起始位置的“常量”。 因此,不能对数组名进行赋值操作。 例 5: int a4, *p; p = a; /正确 a = p; /错误 p+; /正确 a+; /错误,第二章 指 针,第二章 指 针,2.3 空指针与通用指针 (1). 空指针 是个特殊指针值,也是唯一对任何指针类型都合法的指针值。一个指针变量具有空指针值,表示它当时没指向有意义的东西,处于闲置状态。空指针值用0 表示,这个值绝不会是任何程序对象的地址。给一个指针赋值0 就表示

4、要它不指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0 等价的符号常量NULL,程序里可以写: p = NULL; /注意不要与空字符NUL混淆,NUL等价于0 或者: p = 0; 注意: 在编程时,应该将处于闲置的指针赋为空指针; 在调用指针前一定要判断是否为空指针,只有在非空情况下才能调用。,(2).通用指针 通用指针可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。 下面的第三行定义了两个通用指针: int n, *p; double *q; void *gp1, *gp2; 可以直接把任何变量的地址赋给通用指针。 例如,有了上面定

5、义,下面赋值是合法的: gp1 = (void *) ,第二章 指 针,第二章 指 针,2.4 函数指针 2.4.1 函数指针的定义 函数指针即指向函数地址的指针。利用该指针可以知道函数在内存中的位置。因此也可以利用函数指针调用函数。 函数指针的定义方法: (* )(.) 例如:int (*func)(void )这里,func就是一个函数指针。注意:int *func(void)和int (*func)(void)的区别int *func(void); /这是返回一个整型指针的函数 int (*func)(void); /这是一个函数指针,2.4.2 函数指针的使用 例6 :假定有下面的函数

6、声明 int ptr;int fn(int);int (*fp)(int);指出下面的语句是否合法?,为什么?。fp = fn; /正确,将函数fn的地址赋给fpfp = fn(5); /错误,返回给fp的结果不是一个函数地址。fp = break;caseSUB:result=sub(op1,op2); break; . 对于一个复杂的计算器,switch语句将非常长。我们可以用函数指针数组来完成。 doubleadd(double,double);doublesub(double,double);.double(*oper_func)(double,double)=add,sub,.; 第

7、2个步骤是用下面语句替换前面整条switch语句:result=oper_funcoper(op1,op2);oper从数组中选择正确的函数指针,而函数调用操作符将执行这个函数。,第二章 指 针,第三章 预处理器,3.1 预处理器的作用 可以将预处理器看作为一个文本编辑器。它只对程序的文本起作用,而不会进行其他任何依赖于C语言语法的工作。它负责在正式编译前将源程序进行转换,替换宏定义、删去无需编译的代码、插入包含的文件等等。 出于几个主要原因,预处理器为我们提供了一些简化的途径: 首先,可以通过改变一个数字并重新编译程序来改变一个特殊量的所有实例。 其次,可以定义一些东西,它们看起来象函数但没

8、有函数调用所需的运行开销。例如,putchar()和getchar()通常实现为宏以避免对每一个字符的输入输出都要进行函数调用。,第三章 预处理器,3.2 #define 3.2.1 带参数的宏定义 当需要有一个程序块,看上去和用起来像函数一样,但是没有函数调用时的开销时,可以采用宏定义。宏定义可以象函数一样带参数,如: 例 8: #define Add(a,b) (a)+(b) 注意: (1) 括号的作用 预防由运算符优先级引起有关的问题。 例 9: #define Add(a,b) a+b Average = Add(Num1, Num2) / 2; 例中,运算式最终由预处理器展开为: A

9、verage = Num1+Num2 / 2;,(2) 不要忽视空格的作用 例10: #define f (x) (x)-1) Num = f(Num); 上面这个语句会被展开成什么,a还是b,为什么? a. Num = (Num)-1); b. Num = (x) (x)-1)(Num); (3) 宏不是类型定义 例11:#define PWORD int * typedef PBYTE char *; PWORD pA, pB; /pB是什么类型? PBYTE pC, pD; /pD是什么类型?,第三章 预处理器,3.3 #include 和#include “ ” 有什么区别? #inc

10、lude : 在使用时,编译器将会到指定的系统或标准头文件目录查找头文件。通常用于标准或系统提供的头文件。 #include “ ”: 在使用“ ”时,编译器将会到用户创建的项目文件所在目录查找头文件。通常用于程序自己的头文件。 例12: #include #include #include “disp.h” #include “output.h”,第三章 预处理器,第三章 预处理器,3.4 条件编译 (1). 条件编译可以按照不同的编译条件,组织成不同的代码。 例13: #define MCS51 #ifdef MCS51 Baud = 9600; #elif MSP430 Baud = 4

11、800; #elif PC104 Baud = 115200; #endif ,(2). 条件编译可用于调试。将用于调试的语句放入条件编译中。 例14: #define DEBUG TotalNum = a + b; #ifdef DEBUG printf(“The total num is: %d”,TotalNum); #endif 当程序调试结束后,只需将 #define DEBUG一句取消,即可将程序中所有的 调试语句删去。,第三章 预处理器,(3). 在通用的模块中,可以通过条件编译实现功能的可裁减。 例14: #define TMR_SET_EN #ifdef TMR_SET_EN

12、 void TMR_Set(char tmr_init, char tmr_mod, char tmr_fnct) #endif 如果不需要TMR_Set功能,只需将 #define TMR_SET_EN语句删除即可。轻 松实现TMR模块的可裁减特性。,第三章 预处理器,(4). 在宏定义时,避免重复定义。 例15: #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif,第三章 预处理器,第四章 结构、联合和枚举,4.1 结构体 结构是由若干(可不同类型的)数据项组合而成的复合数据对象,这些数据 项称为结

13、构的成分或成员。 (1) 字段 C 语言的结构还提供了一种定义字段的机制,使人在需要时能把几个结构成 员压缩到一个基本数据类型成员里存放,这可以看作是一种数据压缩表示方 式。 例16: struct pack unsigned a:2; unsigned b:8; unsigned c:6; pk1, pk2; 结构变量pk1或者pk2的三个成员将总共占用16位存储,其中a占用2 位,b占 用8 位,c占用6 位。,(2)结构体内部的成员的对齐 在计算结构体长度(尤其是用sizeof)时,需要注意! 根据不同的编译器和处理器,结构体内部的成员有不同的对齐方式,这 会引起结构体长度的不确定性。

14、例17: #include structa chara1; chara2; chara3; A;structb shorta2; chara1; B;void main(void) printf(“%d,%d,%d,%d”, sizeof(char), sizeof(short), sizeof(A), sizeof(B);在Turbo C 2.0中结果都是1,2,3,3在VC6.0中是1,2,3,4,第四章 结构、联合和枚举,第四章 结构、联合和枚举,字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相

15、对于结构首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。 对于上面的准则,有几点需要说明:1)结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏也在stddef.h中定义,如下:#define offsetof(s,m) (size_t) float f; ; union data u1 = 3; /只有u1.n被初始化,4.3 枚举 枚举是一

16、种用于定义一组命名常量的机制,以这种方式定义的常量一般称为 枚举常量。 一个枚举说明不但引进了一组常量名,同时也为每个常量确定了一个整数值。 缺省情况下其第一个常量自动给值0,随后的常量值顺序递增。 (1)给枚举常量指定特定值 与给变量指定初始值的形式类似。如果给某个枚举量指定了值,跟随其后的 没有指定值的枚举常量也将跟着顺序递增取值,直到下一个有指定值的常量为止。 例如写出下面枚举说明: enum color RED = 1, GREEN, BLUE, WHITE = 11, GREY, BLACK= 15; 这时,RED、GREEN,、BLUE 的值将分别是1、2、3,WHITE、GREY

17、的值 将分别是11、12,而BLACK 的值是15。,第四章 结构、联合和枚举,(2)用枚举常量作为数组长度 例19: typedef enumWHITE, RED, BLUE, YELLOW, BLACK, COLOR_NUM COLOR; float BallSizeCOLOR_NUM; 上例中当颜色数量发生变化时,只需在枚举类型定义中加入或删去颜色。 无需修改COLOR_NUM的定义。与大量使用#define相比既简洁又可靠。 如: typedef enum WHITE, RED, BLUE,COLOR_NUM COLOR;,第四章 结构、联合和枚举,第五章 sizeof,5.1 siz

18、eof的定义和使用 sizeof 是C/C+中的一个操作符(注意!不是函数!就像return一样)。 其作用就是返回一个对象或者类型所占的内存字节数。 sizeof有三种使用形式,如下: 1) sizeof(var); / sizeof( 变量 ); 2) sizeof(type_name); / sizeof( 类型 ); 3) sizeof var; / sizeof 变量; 所以,int i;sizeof(i); / oksizeof i; / oksizeof(int); / oksizeof int; / error 为求形式统一,不建议采用第3种写法,忘掉它吧!,第五章 sizeo

19、f,第五章 sizeof,第六章 可移植性,第六章 可移植性,第六章 可移植性,第二个方法是调用大ENDIAN 就是高字节先保存低字节后保存 例如一个16 位整数值0 x1234 用大ENDIAN 方法保存两个连续的字节如下 地址 内容址+0 +1,6.5 使用标准库 尽量使用C语言定义的标准库。这样,从一个系统移植到另一个系统,你的代码很有希望还能具有同样的行为方式。,8051 的LCALL 指令保存下一个指令在堆栈中地址的低字节首先推入堆栈因 此地址是以小ENDIAN 格式保存; 所有别的16 位和32 位值以大ENDIAN 格式保存高字节先保存例如LJMP 和LCALL 指令期望地址以大ENDIAN 格式保存; 浮点数根据IEEE-754 格式保存以大ENDIAN 格式首先保存高字节 如果8051 嵌入应用平台和别的CPU通讯必须知道其所用的字节顺序。,第六章 可移植性,第六章 参考书籍和资料,第六章 参考书籍和资料,第六章 参考书籍和资料,第六章 参考书籍和资料,THE END,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!