Chinaunix首页 | 论坛 | 博客
  • 博客访问: 124418
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 329
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-04 13:23
个人简介

开心过好每天!

文章分类

全部博文(23)

文章存档

2013年(23)

分类: LINUX

2013-08-05 19:07:19

static

在C语言中,关键字static有三个明显的作用:
1)在函数体,一个被声明为static的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

const
1)定义const常量
2)const可以修饰函数的参数和返回值,被const修饰的东西都受到保护,可以防止意外的改动,能提高程序的健壮性
eg:
const int a;
int const a;
两个的作用是一样,a是一个常整型数,其值不能被修改
const int *a;
a是一个指向常整型数的指针,也就是,整型数是不可以通过这个指针修改的,但指针可以被修改(等价于int const *a)
int * const a;
a是一个指向整型数的常指针(永远指向某个地址),也就是说,指针指向的整型数是可以修改的,但指针指向的地方是不可修改的
int const * const a;
a是一个指向常整型数的常指针,也就是说,指针指向的整型数是不可以通过指针来修改的,同时指针指向的地方也是不可修改的

1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
volatile

优化器在用到这个变量时必须每次重新从内存去读写这个变量的值,而不是使用保存在cache中数据。
下面是volatile变量的几个例子:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
几个问题:

1). 一个参数既可以是const还可以是volatile吗?解释为什么。
是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。 
2). 一个指针可以是volatile 吗?解释为什么。 
是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。 
3). 下面的函数有什么错误:
int square(volatile int *ptr) 

 return *ptr * *ptr;

这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: 
int square(volatile int *ptr) 

 int a,b;
 a = *ptr;
 b = *ptr; 
 return a * b;

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下: 
long square(volatile int *ptr) 

 int a; 
 a = *ptr;
 return a * a; 
}

 

阅读(1625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~