C++中为什么char**不能转换成const char**? 探索C语言和C++中const的美丽故事

本文深入探讨了C++中char**无法转换为const char**的原因,涉及C和C++的const特性。通过分析const的层次和C语言的历史遗留问题,揭示了编译器对此类转换的处理差异,以及在C++中如何正确处理const指针以避免警告或错误。
摘要由CSDN通过智能技术生成

本文涉及对C和C++特性比较深入的探讨, 并不适合新手阅读, 仅仅希望解决问题的请跳转最后一节寻找解决方案。对于本文大部分内容, 需要读者至少清晰知道int* constconst int* 类型的区别, 并能读懂形如const int **const *const **的多层const类型, 确保不会被绕晕, 对此概念不清淅的可以阅读该回答

g++编译通过的样例:

/*sample1*/
char p2;
const char p1 = p2;
/*sample2*/
char * p2;
const char* p1 = p2;
/*sample3*/
char p2;
const char& p1 = p2;

g++编译错误的样例:

char ** p2;
const char** p1 = p2;

1. 什么? g++编译错误? 我gcc第一个不服!

当我看到我将int**类型赋值给const int**类型的代码被g++狠狠打上一个error之后,我第一反应是, 这怎么可能不行?把一个不带const的赋值给带const的, 不是理所当然应该编译通过吗?我脑洞大开想起了gcc, 希望gcc能站在我这边给予我赞同。于是我使用gcc编译了完全相同的这两行代码, 编译通过!我很感动, 但是我没法忽略gcc给我留下温柔的警告:

warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值