再议static的作用

2019-08-06 17:41发布

在C语言中,static有三个明显的作用:
1、 在函数体,一个被声明为静态的变量,在这一函数被调用过程中维持其值不变。
2、 在模块内(在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数访问,他是一个本地的全局变量。
3、 在模块内,一个被声明为静态的函数,只可以被这一模块内的其他函数调用,那就是,这个函数被限制在声明他的模块的本地范围内使用。
总结:意图在于强调:本地化数据和本地化代码范围的好处和重要性。

再议 const 含义是什么?
Const意味着“只读“或”常量“。请看如下代码:
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
为什么如此看重关键字const :
1). 关键字const的作用是为给读代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。
2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3). 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
关键字volatile有什么含意
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
volatile的重要性。
1). 一个参数既可以是const还可以是volatile吗?解释为什么。
2). 一个指针可以是volatile 吗?解释为什么。
3). 下面的函数有什么错误:
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
答案:
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*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;
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
angerbird
1楼-- · 2019-08-06 18:02
在模块内(在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外其他函数访问,他是一个本地的全局变量。
angerbird
2楼-- · 2019-08-06 21:15
在模块内,一个被声明为静态的函数,只可以被这一模块内的其他函数调用,那就是,这个函数被限制在声明他的模块的本地范围内使用。
angerbird
3楼-- · 2019-08-06 23:22
关键字const的作用是为给读代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。
huangfeng33
4楼-- · 2019-08-07 04:28
 精彩回答 2  元偷偷看……
msblast
5楼-- · 2019-08-07 10:05
huangfeng33 发表于 2014-2-11 21:36
程序的普通全局变量存在于堆 栈中,全局变量、static 局部变量存在于静态存储区中。收获了,赞一个。

程序的普通全局变量存在于堆 栈中
从哪里看到的?恐怕会误人误己哦。。。

一周热门 更多>