C语⾔const的⽤法详解,C语⾔常量定义详解
有时候我们希望定义这样⼀种变量,它的值不能被改变,在整个作⽤域中都保持固定。例如,⽤⼀个变量来表⽰班级的最⼤⼈数,或者表⽰缓冲区的⼤⼩。为了满⾜这⼀要求,可以使⽤const关键字对变量加以限定:
1. const int MaxNum = 100; //班级的最⼤⼈数
这样 MaxNum 的值就不能被修改了,任何对 MaxNum 赋值的⾏为都将引发错误:
1. MaxNum = 90; //错误,试图向 const 变量写⼊数据
我们经常将 const 变量称为常量(Const)。创建常量的格式通常为:
const type name = value;
const 和 type 都是⽤来修饰变量的,它们的位置可以互换,也就是将 type 放在 const 前⾯:
type const name = value;
但我们通常采⽤第⼀种⽅式,不采⽤第⼆种⽅式。另外建议将常量名的⾸字母⼤写,以提醒程序员这是
个常量。
由于常量⼀旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后⾯的任何赋值⾏为都将引发错误。⼀如既往,初始化常量可以使⽤任意形式的表达式,如下所⽰:
1. #include <stdio.h>
2.
3. int getNum(){
4. return 100;
5. }
6.
7. int main(){
8. int n = 90;
9. const int MaxNum1 = getNum(); //运⾏时初始化
10. const int MaxNum2 = n; //运⾏时初始化
11. const int MaxNum3 = 80; //编译时初始化
12. printf("%d, %d, %d\n", MaxNum1, MaxNum2, MaxNum3);
13.
14. return 0;
15. }
运⾏结果:
100, 90, 80
const 和
const 也可以和指针变量⼀起使⽤,这样可以限制指针变量本⾝,也可以限制指针指向的数据。const 和指针⼀起使⽤会有⼏种不同的顺序,如下所⽰:
1. const int *p1;
2. int const *p2;
3. int * const p3;
在最后⼀种情况下,指针是只读的,也就是 p3 本⾝的值不能被修改;在前⾯两种情况下,指针所指向的数据是只读的,也就是 p1、p2 本⾝的值可以修改(指向不同的数据),但它们指向的数据不能被修改。
当然,指针本⾝和它指向的数据都有可能是只读的,下⾯的两种写法能够做到这⼀点:
1. const int * const p4;
2. int const * const p5;
const 和指针结合的写法多少有点让初学者摸不着头脑,⼤家可以这样来记忆:const 离变量名近就是⽤来修饰指针变量的,离变量名远就是⽤来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。
const 和函数形参
在中,单独定义 const 变量没有明显的优势,完全可以使⽤#define命令代替。const 通常⽤在函数形参中,如果形参是⼀个指针,为了防⽌在函数内部修改指针指向的数据,就可以⽤ const 来限制。
在C语⾔标准库中,有很多函数的形参都被 const 限制了,下⾯是部分函数的原型:
1. size_t strlen ( const char * str );
2. int strcmp ( const char * str1, const char * str2 );
3. char * strcat ( char * destination, const char * source );
4. char * strcpy ( char * destination, const char * source );
5. int system (const char* command);
6. int puts ( const char * str );
7. int printf ( const char * format, ... );
我们⾃⼰在定义函数时也可以使⽤ const 对形参加以限制,例如查字符串中某个字符出现的次数:
1. #include <stdio.h>
2.
3. size_t strnchr(const char *str, char ch){
4. int i, n = 0, len = strlen(str);
5.
6. for(i=0; i<len; i++){
7. if(str[i] == ch){
8. n++;
9. }
10. }
11.
12. return n;
13. }
14.
15. int main(){
16. char *str = "c.biancheng";
17. char ch = 't';
18. int n = strnchr(str, ch);
19. printf("%d\n", n);
20. return 0;
21. }
运⾏结果:
c语言char的用法3
根据 strnchr() 的功能可以推断,函数内部要对字符串 str 进⾏遍历,不应该有修改的动作,⽤ const 加以限制,不但可以防⽌由于程序员误操作引起的字符串修改,还可以给⽤户⼀个提⽰,函数不会修改你提供的字符串,请你放⼼。
const 和⾮ const 类型转换
当⼀个指针变量 str1 被 const 限制时,并且类似const char *str1这种形式,说明指针指向的数据不能被修改;如果将 str1 赋值给另外⼀个未被 const 修饰的指针变量 str2,就有可能发⽣危险。因为通过 str1 不能修改数据,⽽赋值后通过 str2 能够修改数据了,意义发⽣了转变,所以编译器不提倡这种⾏为,会给出错误或警告。
也就是说,const char *和char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许
将char *类型的数据赋值给const char *类型的变量。
这种限制很容易理解,char *指向的数据有读取和写⼊权限,⽽const char *指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发⽣危险。
C语⾔标准库中很多函数的参数都被 const 限制了,但我们在以前的编码过程中并没有注意这个问题,
经常将⾮ const 类型的数据传递给const 类型的形参,这样做从未引发任何副作⽤,原因就是上⾯讲到的,将⾮ const 类型转换为 const 类型是允许的。
下⾯是⼀个将 const 类型赋值给⾮ const 类型的例⼦:
1. #include <stdio.h>
2.
3. void func(char *str){ }
4.
5. int main(){
6. const char *str1 = "c.biancheng";
7. char *str2 = str1;
8. func(str1);
9. return 0;
10. }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论