软件研究室培训(C语言)

上传人:aa****6 文档编号:48670173 上传时间:2018-07-19 格式:PPT 页数:40 大小:413.50KB
返回 下载 相关 举报
软件研究室培训(C语言)_第1页
第1页 / 共40页
软件研究室培训(C语言)_第2页
第2页 / 共40页
软件研究室培训(C语言)_第3页
第3页 / 共40页
软件研究室培训(C语言)_第4页
第4页 / 共40页
软件研究室培训(C语言)_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《软件研究室培训(C语言)》由会员分享,可在线阅读,更多相关《软件研究室培训(C语言)(40页珍藏版)》请在金锄头文库上搜索。

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

2、多看书、勤思考很多国外的经典书籍是由拥有几十年经验的质深程序员编写的。这些书里最重要的是融 入了作者多年的编程经验。多看书,再结合自身平时的积累,不断思考总结是提高编程技术 最有效的办法。第一章 学习编程语言的一些建议第二章 指 针2.1 指针的基本概念2.1.1 指针针是什么?指针是一个变量,它的值是另外一个变量的地址。例12.1.2 指针的类型指针所存储的那个变量类型,就称为指针的类型。例 2 有三个不同类型的指针:int I2, *pI = 右边的三个运算有何不同? pI+;char C2, *pC = pC+;float F2, *pF = pF+;0x00C7指针变量 int *p0

3、x00C7变量 int a上面例中的两个0x00C7有什么区别?2.1.3 指针的三个要素 1.指针指向的地址(指针的内容); 2.指针指向的地址上的内容; 3.指针本身的地址。例 3: int A, *pA, *ppA;pA = ppA = 在复杂的指针都可以通过下表来分析:p 的内存是随机的 一个数,比如:0x3FF0073D程序随即访问 内 存地址:0x3FF0073D0x3FF0073D 是哪里的内存?说不定正好是 Windows老大要用的内存,你竟敢访问 ! Windows一生气,蓝屏。一个指向不明的指针 ,是非常危险的!因此,指针在使用前一定要初始化;在使用前一定要确定指针是非空的

4、! 第二章 指 针2.2 数组与指针对于数组的两个概念:1. C语言中只有一维数组,数组的大小必须在编译时作为一个常数确定下来。 数组的元素可以是任何类型,甚至是数组,由此可以方便地得到多维数组;2. 数组的任何操作,即使采用数组下标进行的运算都等于对应的指针运算。 可以用指针行为替代数组下标的运算。例4 :int a4, *p;p = a; /等价于 p =*(a+2) = 0; /等价于 a2 = 0;p2 = 0; /等价于 a2 = 0; 但数组不同于指针:数组名 a是指向数组起始位置的“常量”。因此,不能对数组名进行赋值操作。例 5:int a4, *p;p = a; /正确a =

5、p; /错误p+; /正确a+; /错误 第二章 指 针第二章 指 针2.3 空指针与通用指针(1). 空指针是个特殊指针值,也是唯一对任何指针类型都合法的指针值。一个指针变量具有 空指针值,表示它当时没指向有意义的东西,处于闲置状态。空指针值用0 表示 ,这个值绝不会是任何程序对象的地址。给一个指针赋值0 就表示要它不指向任 何有意义的东西。为了提高程序的可读性,标准库定义了一个与0 等价的符号常 量NULL,程序里可以写:p = NULL; /注意不要与空字符NUL混淆,NUL等价于0或者:p = 0;注意:在编程时,应该将处于闲置的指针赋为空指针;在调用指针前一定要判断是否为空指针,只有

6、在非空情况下才能调用。(2).通用指针通用指针可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为 void 指针。下面的第三行定义了两个通用指针:int n, *p;double *q;void *gp1, *gp2;可以直接把任何变量的地址赋给通用指针。例如,有了上面定义,下面赋值是合法的:gp1 = (void *) 可以把通用指针的值赋给普通的指针。如果被赋值指针与通用指针所指变量的类 型不符,需要写强制转换:p = (int *)gp1;第二章 指 针第二章 指 针2.4 函数指针2.4.1 函数指针的定义函数指针即指向函数地址的指针。利用该指针可以知道函数在内存

7、中的位置。因 此也可以利用函数指针调用函数。函数指针的定义方法:(* )()例如:int (*func)(void ) 这里,func就是一个函数指针。 注意:int *func(void)和int (*func)(void)的区别int *func(void); /这是返回一个整型指针的函数 int (*func)(void); /这是一个函数指针2.4.2 函数指针的使用例6 :假定有下面的函数声明 int ptr;int fn(int);int (*fp)(int);指出下面的语句是否合法?,为什么?。fp = fn; /正确,将函数fn的地址赋给fpfp = fn(5); /错误,返回

8、给fp的结果不是一个函数地址。fp = break;case SUB:result=sub(op1,op2); break;. 对于一个复杂的计算器,switch语句将非常长。我们可以用函数指针数组来完成。double add(double,double);double sub(double,double);.double (*oper_func)(double,double)=add,sub,.;第2个步骤是用下面语句替换前面整条switch语句:result=oper_funcoper(op1,op2);oper从数组中选择正确的函数指针,而函数调用操作符将执行这个函数。第二章 指 针第三

9、章 预处理器3.1 预处理器的作用可以将预处理器看作为一个文本编辑器。它只对程序的文本起作用,而不会 进行其他任何依赖于C语言语法的工作。它负责在正式编译前将源程序进行转换 ,替换宏定义、删去无需编译的代码、插入包含的文件等等。出于几个主要原因,预处理器为我们提供了一些简化的途径:首先,可以通过改变一个数字并重新编译程序来改变一个特殊量的所有实例 。其次,可以定义一些东西,它们看起来象函数但没有函数调用所需的运行开 销。例如,putchar()和getchar()通常实现为宏以避免对每一个字符的输入 输出都要进行函数调用。第三章 预处理器3.2 #define3.2.1 带参数的宏定义当需要有

10、一个程序块,看上去和用起来像函数一样,但是没有函数调用时 的开销时,可以采用宏定义。宏定义可以象函数一样带参数,如:例 8: #define Add(a,b) (a)+(b)注意: (1) 括号的作用预防由运算符优先级引起有关的问题。例 9: #define Add(a,b) a+b Average = Add(Num1, Num2) / 2;例中,运算式最终由预处理器展开为:Average = Num1+Num2 / 2;(2) 不要忽视空格的作用例10: #define f (x) (x)-1) Num = f(Num); 上面这个语句会被展开成什么,a还是b,为什么?a. Num = (

11、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 “ ” 有什么区别?#include :在使用时,编译器将会到指定的系统或标准头文件目录查找头文件。通 常用于标准或系统提供的头文件。#include “ ”:在使用“ ”时,编译器将会到用户创建的项目文件所在目录查找头文件。通常 用于程序自己的头文件。例12:#i

12、nclude #include #include “disp.h”#include “output.h”第三章 预处理器第三章 预处理器3.4 条件编译 (1). 条件编译可以按照不同的编译条件,组织成不同的代码。 例13:#define MCS51 #ifdef MCS51Baud = 9600;#elif MSP430Baud = 4800;#elif PC104Baud = 115200;#endif (2). 条件编译可用于调试。将用于调试的语句放入条件编译中。 例14:#define DEBUG TotalNum = a + b;#ifdef DEBUGprintf(“The tot

13、al num is: %d”,TotalNum);#endif 当程序调试结束后,只需将 #define DEBUG一句取消,即可将程序中所有的调试语句删去。第三章 预处理器(3). 在通用的模块中,可以通过条件编译实现功能的可裁减。 例14:#define TMR_SET_EN #ifdef TMR_SET_ENvoid TMR_Set(char tmr_init, char tmr_mod, char tmr_fnct) #endif 如果不需要TMR_Set功能,只需将 #define TMR_SET_EN语句删除即可。轻 松实现TMR模块的可裁减特性。第三章 预处理器(4). 在宏定义

14、时,避免重复定义。 例15:#ifndef TRUE #define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif 第三章 预处理器第四章 结构、联合和枚举4.1 结构体结构是由若干(可不同类型的)数据项组合而成的复合数据对象,这些数据 项称为结构的成分或成员。 (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)时,需要注意!根据不同的编译器和处理器,结构体内部的成员有不同的对齐方式,这会引起结构体长度的不确定性。例17:#include

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号