起因是一段学习示例代码
void Const_ptr_2()
{
char* const s = "Pentag"; //这句代码报错了
}
这是一个const指针用法的样例代码,但是我放在编译器运行后却发现错误了(目前发现了解决方法,但是好像不是我想要的效果,后面会说)
这段代码意味着 s 是一个常量指针,它始终指向某个固定内存区域,而不是可以改变的内存区域。
"Pentag"这是一个字符串常量,它被定义为 const char * 的类型,而它被赋予给了char * const s ,这是不允许的。
这里有一个矛盾:“pentag”是一个只读的内存区域,而s是一个可以改变指向的变量。在C\C++中,常量不能被重新定义为非常量变量,如果想将字符串常量赋值给一个指针,那么指针必须被定义为 const char * 而不是 char * const 。这是其中一种解决办法,但并不是我想知道的,因为这显然和这个例子背道而驰。
于是我又发现一种写法:
const char * str ="Pentag";
char * const s = str;
在这段代码中,s是一个常量指针,它始终指向"Pentag"这个字符串的首地址。即使我修改str,也不会改变s的值,因为s指向一个固定的内存区域。emmmmmm一直解释到这里都是有理有据没有问题的,事实上,还是报错了,报错原因和上面单独的一句是一样的【const char * 类型的值不能用于初始化 char * const 类型的实体】
当然,我依然搜到了解决方案:
char * const s =(char*)str;
(char *)str 会将 const char *转换为char * ,这样就可以将str的值赋予给s,这段代码能够正确执行,是因为s是一个常量指针,它所指向的内存区域是不能被改变的,但是str却是一个const指针,它本身也指向的是一个 const 内存区域。
思路梳理到这里的时候已经产生混乱了,也许是因为对指针的本质内涵不够透彻的了解,我对我原本确信的逻辑思路产生了怀疑,我又没办法把我的思路连贯起来了,我需要一个大佬再给我解释一下!