const int * const p4;int const * const p5;
const 和指针结合的写法多少有点让初学者摸不着头脑,大家可以这样来记忆:const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。
二、const 和函数形参
在C语言中,单独定义 const 变量没有明显的优势,完全可以使用#define命令代替。const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。
在C语言标准库中,有很多函数的形参都被 const 限制了,下面是部分函数的原型:
size_t strlen ( const char * str );int strcmp ( const char * str1, const char * str2 );char * strcat ( char * destination, const char * source );char * strcpy ( char * destination, const char * source );int system (const char* command);int puts ( const char * str );int printf ( const char * format, ... );
我们自己在定义函数时也可以使用 const 对形参加以限制,例如查找字符串中某个字符出现的次数:
#include <stdio.h>size_t strnchr(const char *str, char ch){ int i, n = 0, len = strlen(str); for(i=0; i<len; i++){[="" span][="" span]="" if[="" span](str="=" ch){[="" n++;[="" }[="" span][="" p][="" return[="" span]="" n;[="" span]}[="" span]int[="" main[="" span]()[="" span]{[="" char[="" *str=""http://c.biancheng.net";" ch="'t';" int[="" n="strnchr(str," ch);[="" printf[="" span]("%d\n"[="" span],="" n);[="" 0[="" span];[="" align][align="left]运行结果:
3
根据" strnchr()="" 的功能可以推断,函数内部要对字符串="" str="" 进行遍历,不应该有修改的动作,用="" const="" 加以限制,不但可以防止由于程序员误操作引起的字符串修改,还可以给用户一个提示,函数不会修改你提供的字符串,请你放心。[="" 和非="" 类型转换[="" b][="" str1="" 被="" 限制时,并且类似const="" char="" *str1这种形式,说明指针指向的数据不能被修改;如果将="" 赋值给另外一个未被="" 修饰的指针变量="" str2,就有可能发生危险。因为通过="" 不能修改数据,而赋值后通过="" str2="" 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告。[="" *和char="" *是不同的类型,不能将const="" *类型的数据赋值给char="" *类型的变量。但反过来是可以的,编译器允许将char="" *类型的数据赋值给const="" *类型的变量。[="" *指向的数据有读取和写入权限,而const="" *指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。[="" 限制了,但我们在以前的编码过程中并没有注意这个问题,经常将非="" 类型的数据传递给="" 类型的形参,这样做从未引发任何副作用,原因就是上面讲到的,将非="" 类型转换为="" 类型是允许的。[="" 类型赋值给非="" 类型的例子:[="" <stdio.h="">void func(char *str){ }int main(){ const char *str1 = "c.biancheng.net"; char *str2 = str1; func(str1); return 0;} 第7、8行代码分别通过赋值、传参(传参的本质也是赋值)将 const 类型的数据交给了非 const 类型的变量,编译器不会容忍这种行为,会给出警告,甚至直接报错。
免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。
推荐阅读:
关注微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。 长按前往图中包含的公众号关注
</len;></stdio.h></stdio.h>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!