const关键字用法¶
本文介绍 const 在修饰局部变量、全局变量、指针、参数以及返回值时的用法,文末指出 const、code、static不同之外。
修饰局部变量¶
const int n=5;
int const n=5;
接下来看看 const 用于修饰常量静态字符串,例如:
const char* str="fdsafdsa";
常量指针与指针常量¶
常量指针 是指针指向的内容是常量,可以有一下两种定义方式。
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;
Tip
区分常量指针和指针常量的关键就在于星号的位置,我们以星号为分界线,如果 const 在星号的左边,则为常量指针,如果 const 在星号的右边则为指针常量。如果我们将星号读作‘指针’,将 const 读作‘常量’的话,内容正好符合。int const * n;是常量指针,int *const n;是指针常量。
指向常量的常指针
是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。
const int* const p;
修饰函数的参数¶
根据常量指针与指针常量,const 修饰函数的参数也是分为三种情况
1、防止修改指针指向的内容
void StringCopy(char *strDestination, const char *strSource);
2、防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 )
3、以上两种的结合。
修饰函数的返回值¶
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加 const 修饰的同类型指针。
例如函数
const char * GetString(void);
char *str = GetString();
const char *str = GetString();
修饰全局变量¶
全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致出了 bug 后很难发现,如果一定要用全局变量,我们应该尽量的使用 const 修饰符进行修饰,这样防止不必要的人为修改,使用的方法与局部变量是相同的。
code、const、static¶
原来 keil 51 的时候, code 修饰的变量放在 ROM 中,而 const 修饰的变量为只读(不可修改),放在 RAM 中。可以使用 code const 修饰变量,表示变量存储在 ROM 中,且为只读,由此看来 code 和 code const 修饰变量有一样的功用。
在 keil MDK 中,code 无法使用,使用会报错。用 const 修饰的变量放在 ROM 中。此时用 const 修饰的变量就不能再修改了,因为在 ROM 中是只读的。
static 是静态的,修饰的函数和全局变量只能在本文件中使用。另外,如果 static 修饰了局部变量,那么该局部变量在函数销毁时变量依然存在,效果同全局变量。