首先我百度了一下c语言中“const ”关键字和“static”关键字的用法,具体几点如下:
1、const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
2、const可以修饰变量,函数的入参,函数的返回值3、static第一个作用:隐藏
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
4、static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
5、static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
接下来,我在一个小程序中,根据具体用法,依次实践一下,用来加深理解。
首先用一个小示例,来解释一下什么是static保持内容的持久。
#include "stdio.h"
void kk()
{
static int a=0;
printf("a=%d\n",a);
a++;
}
void main()
{
kk();
kk();
}
此时,a为静态变量,所以在调用一次kk函数后,进行了一次初始化,这将是唯一的一次初始化,第二次调用kk函数的时候,a不再进行初始化,a此时的值为1。所以,此程序的运行结果为
a=0
a=1
#include "stdio.h"
void kk()
{
int a=0;
printf("a=%d\n",a);
a++;
}
void main()
{
kk();
kk();
}
那么,当把static去掉的时候,结果就显而易见,因为每次调用kk函数的时候,都会对a进行一次初始化。此时程序的运行结果为
a=0
a=0
还是利用这个小程序,来说明一下static的另一个作用——为变量赋初值为0;
#include "stdio.h"
void kk()
{
static int a;
printf("a=%d\n",a);
a++;
}
void main()
{
kk();
kk();
}
可以看出,这里跟上面的区别是没有对a进行初始化,但是由于前面有static关键字,所以,a被自动赋值为0。所以,程序的执行结果为
a=0
a=1
接下来,来具体说明一下static的隐藏功能。
其实,说是隐藏功能并不是很规范,应该说是内部链接属性。
那么什么是内部链接属性呐?
如果在一个程序中有两个.c文件a.c和b.c那么这两个文件之间必定存在相互使用对方的全局变量或者函数的关系。以全局变量为例。在a.c中定义了一个全局变量int global_in_a = 2003;在b.c中为了使用这个全局变量就必须先extern int global_in_a;然后再使用。我们称这样的全局变量global_in_a具有“外部链接属性”(其实就是其它文件可以访问它的意思)。如果我们把a.c里的int global_in_a = 2003;改为static int global_in_a = 2003;那么b.c无论如何声明也无法访问该global_in_a。此时我们称int global_in_a具有内部链接属性。
接下来,讨论一下const的相关用法,主要分为以下3个方面:
1、const变量 & 常量
const变量仍然不等同与常量!
const int n=5;
int a[n];
这种用法在c语言中仍然是不合法的,n仍然是一个变量。
2、const变量 & const 限定的内容
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
在这里,p2为不可变,p2++不合法。
3、const & 指针
1)、const在前面
const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可变
const (char *) pContent;//pContent是const,*pContent可变
char* const pContent; //pContent是const,*pContent可变
const char* const pContent; //pContent和*pContent都是const
2)、const在后面,与上面的声明对等
int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可变
(char *) const pContent;//pContent是const,*pContent可变
char* const pContent;// pContent是const,*pContent可变
char const* const pContent;// pContent和*pContent都是const
沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变
量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常
量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。
另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类
型(如 char),因此,这是限定指针是const。