const的用法
________________________________________________________
const的用法我觉得对于一个以后想着做一个优秀的程序员来说,这是必须熟练掌握的技能。
因为网上有好多的文章介绍
它的写的非
常好,有的我就直接拿过来了~,现在我们来看看他
的用法。
const 要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值.
1、函数体内修饰局部变量
例:
void func(){
const int a=0;
}
const作为一个类型限定词,和int有相同的地位。
const int a;
int const a;
是等价的。于是此处我们一定要清晰的明白,const修饰的对象是谁,是a还是int
const要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值(l-value)。
所以很明显它修饰的是a。
这
是一个很常见的使用方式:
const double pi=3.14;
在程序的后面如果企图对pi再次赋值或者修改就会出错。
然后看一个稍微复杂的例子。
const int* p;
因为int* p;和 int *p;是等价的。
所以const int (*p)和int const (*p)是等价的。
现在一目了然const 修饰的是谁? 是*p.
所以p+=1;是合法的
*p+=1;是非法的因为const修饰了你。
int* const p;那这个什么意思?
看const修饰的是什么? 它修饰的p。
但是p是一个int型的指针,所以这个指针的地址没有办法修改。
p+=1; //这就是非法的
*p+=1; //这个是合法的
再看一个更复杂的例子,它是上面二者的综合
const int* const p;说明p自己是常量,且p指向的变量也是常量。
于是
p+=1; //非法
*p+=1; //非法
const 还有一个作用就是用于修饰常量静态字符串。 例如:
p+=1; //非法
*p+=1; //非法
const 还有一个作用就是用于修饰常量静态字符串。 例如:
const char* name=David;
如果没有const,我们可能会在后面有意无意的写name[4]='x'这样的语句,这样会
导致对只读内存区域的赋值,然后程
序会立刻异常终止。有了 const,这个错误就
能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错
误在编译
期被发现。
2、在函数声明时修饰参数
举个例子void * myMemMove(void *dst,constvoid *src,intcount )
这是我写的memmove函数的声明,这个函数的意思
就是(任意类型)
把*src的
内容复制给*dst,我们现在很明显的看到*src它只让你
复制,你不能修
改它
的
值,所以怕你
在以后的函数的定义里出现问题现在在声明里限制你。
3、全局变量
我们的原则依然是,尽可能少的使用全局变量。
我们的第二条规则 则是,尽可能多的使用const。
如果一个全局变量
只在本文件中使用,那么用法和前面所说的函数局部变量没有什
么区别。
如果它要在多个文件间共享,那么就牵扯到
一个存储类型的问题。
有两种方式。
1.使用extern
例如
/* test.h */
extern const double pi;
/* test.c */
const double pi=3.14;
然后其他需要使用pi这个变量的,包含test.h
#include test.h
或者,自己把那句声明复制一遍就好。
这样做的结果是,整个程序链接完后,所有需要使用pi这个变量的共享一个存储区域。
2.使用static,静态外部存储类
/* constant.h */
static const pi=3.14;
需要使用这个变量的*.c文件中,必须包含这个头文件。
前面的static一定不能少。否则链接的时候会报告说该变量被多次定义。 这样做的结果是,每个包含了constant.h的
*.c文件,都有一份该变量自己
的copy,
该变量实际上还是被定义了多次,占用了多个存储空间,不过在加了static关键字
后,解决了文件间重定义的冲突。 坏处是浪费了存储空间,导致链接完后的可执行文件变大。但是通常,这个,小小 几字
节的变化,不是问题。
好处是,你不用关心这个变量是在哪个文件中被初始化的。
其实const我觉得更多是程序员自己限制自己,自己告诉自己后面哪里不能出现错误
举个例子吧。
#include<stdio.h>
#include<Windows.h>
int main()
{
int *p;
const int a = 0;
p = &a;
*p = 3;
printf("a= %d \n", a);
system("pause");
return 0;
}
其实通过侧面的修改const所修饰的值的,所以这个更多是用来限制程序员的,所以
在日常的代码编写多用const,从我做起,把它当成一种习惯。