关于const指针的一个常见误区
关于const
,我曾因为其在C
和C++
中的不同,还有一些编译器对未定义的处理不同,搞得晕头转向…
后来有次在阅读《C primer plus
》中我终于梳理了有关const
的结论。
1.const基础知识
首先要明白const
的难点在于修饰指针的时候,对于const int* const ptr;
来说:
-
前一个
const
修饰*ptr
,不能将*ptr
的值改变 -
后一个
const
修饰ptr
,不能将ptr
的值改变
2.const基本规则
在C
中:
-
把
const
数据或者非const
数据的地址,“初始化”或者“赋值给”指向const
的指针是合法的 -
只能把
非const
数据的地址,“赋值给”非const
的指针 -
规定使用
非const
标识符修改const
数据导致的结果是未定义的,编译器遇到这样的代码时可能给出警告(因为这样子就可以通过新的指针改变const
指针指向的数据)
//演示规则1void test_1(){double arr1[3] = { 1.2,3.2,3.14 };//非constconst double arr2[4] = { 0.12,1.2,3.2,3.14 };//constconst double* pnc = arr1;//有效,初始化pnc = &arr1[1];//有效,赋值pnc = arr2;//有效,赋值int i = 10;int* p = &i;const int** pp = &p;*pp}//演示规则2void test_2(){double arr1[3] = { 1.2,3.2,3.14 };const double arr2[4] = { 0.12,1.2,3.2,3.14 };double* pnc = arr1;//有效,初始化pnc = &arr1[1];//有效,赋值pnc = arr2;//无效,并且VS2022给出警告}//演示未定义行为#include <stdio.h>int main(){const int i = 10;//不可修改iconst int* pi = &i;//不可修改(*pi)int* temp = pi;*temp = 20;printf("%d\n", i);return 0;}//在vs2022的17.7.0版本中,这样做是可以的,输出20//在CentOS7下的gcc的4.8.5版本中,直接不给编译进行报错
吐槽:是谁造谣可以用
非const
指针绕过去修改const
数据的!?啊?VS2022
可以做到?那我们换个平台试试。
你动下试试?类型检查这一方面直接就过不了关…