【c语言】const关键字

1.const与指针

a.const int * p1;(常量指针)
b.int const * p2;(常量指针)
c.int* const p3;(指针常量)
在a与b情况中,指针指向的数据是只读的,表示p1与p2本身的值可以更改,但所指向的数据不可以修改。在c情况指针是只读的表示p3本身的值不可以修改。

e.const int * const p4;
d.int const * const p5;
在e与d情况指针本身与它所指向的数据都是只读的。
记忆方法:const 离变量名近就是用来修饰指针变量的,如c情况;离变量名远就是用来修饰指针指向的数据,如a与 b情况;如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据如d与e情况。

2.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 类型是允许的。

你可能感兴趣的:(内功心法)