
C语言中的关键字总共有32个:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 但是,往往初学者很难会合理使用它们.这个小专题就主要讲解const static void volatile typedef sizeof register extern这些“特殊”关键字的使用方法,可以说能否很好的使用这些关键字可是展示一个C程序员的基本素养。学会了对这些关键字的使用,不仅仅对笔试、面试有帮助,更重要的是对自己以后做项目有很大帮助,别到时候项目主管看到你写的代码后对你失望吆。
这篇文章就先将const这个特殊的关键字。通过这篇文章,你将会搞懂以下代码:
//const修饰一般变量
const int i = 0; int const = 0;
//const修饰数组
const int a[4] = {1, 2, 3, 4} int const a[4] = {1, 2, 3, 4}
//const修饰指针
const int *p
int const *p
int * const p
const int * const p
//const修饰函数参数和返回值
char *strcpy(char *dest, const char *src);
int strcmp(const char *s1, const char *s2);
(1)const全称:constant 也就是恒定不变的意思。如果说看到这个关键字只知道这个关键字是定义常量,那么请你好好看看这篇文章,因为你会有意想不到的收获。
(2)const不仅仅可以定义常量,被它所修饰的东西都受到某种强制保护,说白了就是加了const之后,可以访问但是不能再修改这个变量的值即这个变量是“只读的”。这样做可以提高程序的健壮性。还可以用const来修饰函数的参数、返回值。其中也涉及到const与指针的结合。
注意:在使用const修饰变量时,一定要给变量初始化,否则之后就不能赋值了!
(3)const修饰普通变量、数组和指针变量
在很多地方可能都见到const 类型名 变量名; const 类型名 *变量名;比如const int a; const int *a;const修饰的指针涉及到指针常量和常量指针。
#include //演示const关键字用法int main(int argc, char** argv){const int i = 0;i = 1;return 0;}
运行结果:

分析结果:编译没有通过出错,编译器确实提醒我们变量i是只读变量,不能再进行复制操作。
1)const 类型名 变量名与 类型名 const 变量名 一样吗?
一样。将上面代码中const int i = 0;改为int const i = 0;结果一样。不过我们用的比较多和见得比较多的就是const int i = 0这种形式。

2)const 类型名 变量名[数组元素个数]与 类型名 const [数组元素个数] 一样吗?
#include //演示const关键字用法int main(int argc, char** argv){//const int a[4] = {1, 2, 3, 4}; //2种写法显示错误一样 int const a[4] = {1, 2, 3, 4}; a[0] = 2;//想给数组中第一个元素重新赋值,但是失败,因为数组是只读的return 0;}
运行结果:

分析结果:2种写法一样。但是编译没有通过,显示为read-only只读的。所以当我们要让数组中的不容不改变时可以用const关键字。
3)const 类型名 *变量名与 类型名 const *变量名 一样吗?
#include //演示const关键字用法int main(int argc, char** argv){ int a = 5; const int *i = &a; *i = 1; return 0; }
运行结果:

分析结果:编译没有通过,出错 因为const修饰的是*i
将上面代码中const int *i = 0;改为int const *i = 0;结果一样。 不过我们用的比较多和见得比较多的就是const int *i = 0这种形式。
将前面代码稍微改动一下,如下所示
#include //演示const关键字用法int main(int argc, char** argv){int a = 5, b = 10;const int *i =&a; //*i = 1; //编译都没有通过,出错i = &b; //编译通过,还可以间接访问操作*iprintf("i = %d