C语言关于const的那点事儿~~~

const应该是单词constant的缩写,意思是永恒的不变的。const这个关键字用得到的地方很多,用的方式也很多,因此让人疑惑的地方也比较多,今天做个总结。

  • 用const来说明一个常量
const int a;
int const a;

都是把a常量化了,告诉大家不要修改a的值,如果你非要修改a的值

const int a = 10;
int *p = (int*)&a;
*p = 111;

用这种方式也是可以的,但是const就是告诉你这个值是不要修改也是不用修改的,所以我们还是要遵守这种道德规范。

  • const用于指针
//修饰的是*p,说明*p是不可变的,也就是说p这个指针可以指向别的地方,但是指向的值不可以修改
const int *p;
int const *p;

//修饰的是p,p是一个指针,也就是说p指向哪里是不能变的,但是指向的位置的值可以修改
int *const p;

//p既是一个常量指针,而且指向一个常量
const int *const p;

嗯,其实也不是很复杂,主要要分清楚const修饰限定的是哪个,是被看作整体的整型变量*p还是单独的整型指针p,修饰p那么p就是常量指针,不能再被修改,但是指针指向的值没被修饰,仍然是变量;修饰*p那*p就是常量不能再修改,但是指针仍然是变量,可以被修改;当然还有第四条,常量指针指向常量,都被const限定了;还有就是 const int 和 int const 其实是一样的。

下面有几个例子

  • const 还可以用来声明常量字符串
const char *p = "wangchengmeng";//声明一个字符串常量,但是p依然可以指向别的字符串
*p = "chengmengwang"; //非法操作
char *a = "chengmengwang"; 
p = a ; //合法操作 

这样声明也可以
const char p[] = "wangchengmeng";

 

  • const 声明形参
int main(const int argc, char *const argv[]);
//char *const argv[]; argv[]是一个字符串指针的数组,被const限定之后就成为了
//常量字符串指针的数组,这个数组中存储的字符串指针是常量,不能被修改,但是字符串指针指向的值
//可以被修改
char *a="wangchengmeng";
argv[0] = a;//非法
*argv[0] = *a;//合法

以下内容转自https://blog.csdn.net/sddzycnqjn/article/details/7289712 写的很好,我就直接拿来用了,不重新写了

3、全局变量。
我们的原则依然是,尽可能少的使用全局变量。
我们的第二条规则 则是,尽可能多的使用const。
如果一个全局变量只在本文件中使用,那么用法和前面所说的函数局部变量没有什
么区别。
如果它要在多个文件间共享,那么就牵扯到一个存储类型的问题。


有两种方式。
1.使用extern
例如
/* file1.h */
extern const double pi;
/* file1.c */
const double pi=3.14;
然后其他需要使用pi这个变量的,包含file1.h
#include file1.h
或者,自己把那句声明复制一遍就好。
这样做的结果是,整个程序链接完后,所有需要使用pi这个变量的共享一个存储区域。


2.使用static,静态外部存储类
/* constant.h */
static const pi=3.14;
需要使用这个变量的*.c文件中,必须包含这个头文件。
前面的static一定不能少。否则链接的时候会报告说该变量被多次定义。
这样做的结果是,每个包含了constant.h的*.c文件,都有一份该变量自己的copy,
该变量实际上还是被定义了多次,占用了多个存储空间,不过在加了static关键字
后,解决了文件间重定义的冲突。
坏处是浪费了存储空间,导致链接完后的可执行文件变大。但是通常,这个,小小
几字节的变化,不是问题。
好处是,你不用关心这个变量是在哪个文件中被初始化的。




最后,说说const的作用。
const 的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的
作用就是让更多的逻辑错误在编译期被发现。所以我们要尽可能的多使用const。
但是很多人并不习惯使用它,更有甚者,是在整个程序 编写/调试 完后才补
const。如果是给函数的声明补const,尚好。如果是给 全局/局部变量补const,那
么……那么,为时已晚,无非是让代码看起来更漂亮了。关于const的使用,曾有一
个笑话说,const 就像安全套,事前要记牢。如果做完后才想起来该用而忘了用,
呵呵……呵呵……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值