C语言const

关键字const是用来定义常量,如果一个变量被const修饰,那么它的值不能再被改变,这一点上作用和define 一致。但是const存在的意义不止于此。
const修饰符有以下的优点:

  • 预编译指令只是对值进行简单的替换,不进行类型检查
  • const可以保护修饰的变量值,防止意外修改,增强程序健壮性
  • 编译器一般情况下不给const修饰的常量分配存储空间,而是做在一个符号表中,这样其就变成了一个编译期间的常量,没有存储和读取内存的操作使得效率很高

修饰局部变量

① 修饰变量

const int n=5;
=
int const n=5;

以上这两种写法是一致的,但是需要注意的是,这一步一定要进行赋值,否则后面没有赋值的机会了。
② 修饰常量静态字符串

const char* str = "fdisk"

对比

str[4] = "fdisk"

后者更容易遭到篡改,但是用const修饰程序在编译时可以立即检查出错误。在编译期间就可以发现问题。

常量指针和指针常量

const在左边是常量指针,const在右边是指针常量**

常量指针

const int * n;
=
int const * n;

常量指针是说不能通过这个指针改变变量的值,但是可以通过其他的引用来改变变量的值

int a =5;
const int * n = &a;
a = 6;

② 常量指针指向的值不能改变,但是这个并不意味着指针本身不能改变,常量指针可以指向其他地址

int a = 5;
int b = 6;
const int* n = &a;
n = &b

指针常量

指针常量意味着指针本身是常量,不能指向其他地址

int * const n;

同样,需要注意的是,指针常量指向的地址不能改变,但是地址中保存的值是可以改变的

int a = 5;
int *p = &a;
int * const n = &a;
*p = 8;

意思就是用另一个普通指针去修改指针常量指向的位置是可以的。

指向常量的常指针

那么结合以上情况,焊死指针和指针指向的值就为如下形式:

const int* const p;

修饰函数的参数

① 防止修改指针指向的内容

void StringCopy(char *strDestination, const char *strSource);

② 防止修改指针指向的地址

void StringCopy(char *strDestination, char * const strSource);

③ 防止修改指针指向的地址以及防止指针移位

void StringCopy(char *strDestination, const char * const strSource);

修饰函数的返回值

如果是以“指针传递”方式的函数返回值增加const修饰,那么函数返回值就是指针的内容不能被修改,该返回值只能被赋值给同样const修饰的指针

const char * GetString(void);
const char * str = GetString();

修饰全局变量

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容