C语言的知识点复习

上传人:博****1 文档编号:508553211 上传时间:2023-01-26 格式:DOC 页数:9 大小:32KB
返回 下载 相关 举报
C语言的知识点复习_第1页
第1页 / 共9页
C语言的知识点复习_第2页
第2页 / 共9页
C语言的知识点复习_第3页
第3页 / 共9页
C语言的知识点复习_第4页
第4页 / 共9页
C语言的知识点复习_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《C语言的知识点复习》由会员分享,可在线阅读,更多相关《C语言的知识点复习(9页珍藏版)》请在金锄头文库上搜索。

1、文档供参考,可复制、编制,期待您的好评与关注! 最近开始学习Linux设备驱动程序第三版,参阅牛人关于嵌入式开发的准备知识点,编写了学习笔记。1、宏尽管在学习C的时候,牛人们往往不厌其烦的教导我们:应该尽量避免使用宏,但是在linux代码中宏的使用却非常普遍。除了移植性好,估计还是方便使然。使用宏最应该注意的是侧效可能引起的副作用,当然没有了类型检测,也是需要特别小心的地方。示例代码:/*写一个宏MAX ,输入两个参数并返回较大的一个*/#define MAX(a,b) (a) (b) ? (a) : (b)显然的,语义简单明了。这里用括号避免了侧效,但是得注意a、b类型。2、死循环关于的死循

2、环的使用,牛人们提供了多种写法,一般有如下三种写法:A、while(1)B、for(;)C、LOOP:goto LOOP;有时候我也挺郁闷的,怎么会没有统一的写法呢?用哪种好呢?所以也尝试着分析了一下,以下是测试代码,并附上了VC6.0下的反汇编代码:int main(int argc, char *argv)int i=0, j=0;while(1)00401036 mov eax,10040103B test eax,eax0040103D je main+44h (00401054) if(i+ = 10)0040103F mov ecx,dword ptr ebp-400401042

3、mov edx,dword ptr ebp-400401045 add edx,100401048 mov dword ptr ebp-4,edx0040104B cmp ecx,0Ah0040104E jne main+42h (00401052) break;00401050 jmp main+44h (00401054) 00401052 jmp main+26h (00401036)for(;)if(j+ = 10)00401054 mov eax,dword ptr ebp-800401057 mov ecx,dword ptr ebp-80040105A add ecx,10040

4、105D mov dword ptr ebp-8,ecx00401060 cmp eax,0Ah00401063 jne main+57h (00401067) break;00401065 jmp main+59h (00401069) 00401067 jmp main+44h (00401054)LOOP:if(k+ = 10)004013C0 mov edx,dword ptr ebp-0Ch004013C3 mov eax,dword ptr ebp-0Ch004013C6 add eax,1004013C9 mov dword ptr ebp-0Ch,eax004013CC cmp

5、 edx,0Ah004013CF jne LOOP+13h (004013d3) goto STEP_EXIT;004013D1 jmp STEP_EXIT+4 (004013d9) goto LOOP;004013D3 jmp LOOP (004013c0) STEP_EXIT:return 0;从VC6.0的汇编代码可以看出:B、C的效率是一样的,A多出了3条指令的判断代码,但是一般的情况下,牛人们又建议少使用goto,所以B是最优的选择。下面是GCC的汇编代码(编译环境Ubuntu9.10+GCC4.4.1):.file test.c.Text.globl main.type main,

6、 functionmain:pushl %ebpmovl %esp, %ebpsubl $16, %espmovl $0, -4(%ebp)jmp .L4.L10:nop.L4:cmpl $3, -4(%ebp)sete %aladdl $1, -4(%ebp)testb %al, %alje .L10nopjmp .L3.L11:nop.L3:cmpl $6, -4(%ebp)sete %aladdl $1, -4(%ebp)testb %al, %alje .L11nopjmp .L6.L12:nop.L6:cmpl $9, -4(%ebp)sete %aladdl $1, -4(%ebp

7、)testb %al, %alje .L12nop.L8:movl $0, %eaxleaveret.size main, .-main.ident GCC: (Ubuntu 4.4.1-4ubuntu8) 4.4.1.section .note.GNU-stack,progbits可以看出GCC的汇编结果是A、B、C三种方法都一样。3、关于指针指针是C里面最重要的一个概念,其使用也是非常灵活,但是一些定义我总是一下子说不清楚,下面给出示例和解释:示例:用变量a给出下面的定义 指向整型数的指针 int *a; 指向指针的的指针,它指向的指针是指向一个整型数 nt *a; 有10个指针的数组,每

8、个指针指向一个整型数 int *a10; 指向有10个整型数数组的指针 int (*a)10; 指向函数的指针,该函数有一个整型参数并返回一个整型数 int (*a)(int); 指针数组,每个指针都指向一个函数,该函数有个整型参数并返回整型数 int (*a10)(int); 关于指针,有一个重要的问题:就是野指针的防范。野指针的形成主要有如下可能:A、指针变量没有被初始化;B、指针被free或者delete之后,没有置为NULL;C、指针操作超越了变量的作用范围。解决之道如下:A、做好初始化;B、在内存回收后,立即设置指针为NULL;C、指针操作超越了变量的作用范围是比较难防范的,比如操作

9、越界,临时变量被指针使用,都能造成野指针的出现,做好代码审查吧。4、关于关键字static在嵌入式开发中,关键字static经常被使用。下面就其三种使用方式及注意事项分别说明:A、局部static变量局部static变量有如下三个特点:(1) 存储空间分配在全局数据区,在程序整个运行期间都不释放。(2) 所处模块在初次运行时对其初始化,且只操作一次。(3) 如果不赋初值,编译器会自动赋初值0或空字符。注意事项是:static变量每次调用时,都指向同一块内存,具有“记忆性”,这样破环了所在模块的可重入性。这样在多线程程序设计或递归程序设计中,要特别注意这个问题。B、外部static变量/函数在C

10、中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。此时“static”的含义不是指存储方式,而是指变量/函数的作用域仅局限于本文件。这样做的好处就是:不用担心自己定义的外部变量/函数,是否会与其它文件中的同名。5、关于关键字const用const修饰的定义示例及解释如下:const int a; 一个常整型数 int const a; 一个常整型数 const int *a; 指向常整型数的指针(即整型数是不可修改的,但指针可以) int * const a; 指向整型数的常指针(被指向的整型数可以修改而指针不可修改) int const * a const; 指向常整

11、型数的常指针(即指针及指向的整型数都是不可修改的) 得关注一个问题,就是为什么要使用关键字const呢?理由如下:A、声明一个参数为常量是为了告诉用户这个参数的应用目的;B、通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码;3) 使用关键字const可以利用编译器来保护那些不被改变的参数,防止其被无意的代码修改,这样可以减少bug的出现。6、关于关键字volatile一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备

12、份。下面是volatile变量的几个例子:A、并行设备的硬件寄存器(如:状态寄存器);B、中断服务程序中会访问到的非自动变量(Non-automatic variables);C、多线程应用中被几个任务共享的变量。示例代码如下:int square(volatile const int *ptr)return *ptr * *ptr; 上面这段代码是问题代码,由于*ptr的值可能被意想不到地改变,因此return的值可能是两个不同数的积。正确的代码如下:long square(volatile const int *ptr)int a;a = *ptr;return a * a; 6、关于位操作位操作在嵌入式开发中也是经常被用到的。位域(bit fields)可移植性差,建议避免使用,而使用宏和位掩码(bit masks)操作。示例代码如下:#define BIT3 (0x1 6) ? puts( 6) : puts(6。

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

当前位置:首页 > 行业资料 > 国内外标准规范

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