char**为何无法转为const char**?——对const的进一步探讨

本文详细探讨了C/C++中const指针的用法及限制条件。通过具体示例,阐述了不同类型的const指针如何影响对内存的访问与修改,并解释了为何char**无法直接转换为constchar**。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在优快云上的论坛中,我已经发表过两篇关于const的用法以及修饰方式。这里想更深入地探究const的本质问题。

我们都这么用过:

char a = 0;
const char *= &a;

 也就是说char*可以转为const char*。这个是合法的,因为const char*意味着该指针变量指向char类型变量的地址,任何通过p来指向变量a地址的指针变量只能用const*来修饰,也就是说,它们无法对a的值进行修改

下面来解释一下为什么char**无法转为const char**。下面以C99标准规格说明书中的一个样例作为例子说明:

 

const char **cpp;
char *p;
const char c = 'A';
cpp 
= &p; // constraint violation
*cpp = &c; // valid
*= 0// valid

从上面代码中我们可以看出,一开始p处于悬挂状态,它是char*类型的指针变量。然后cpp指向p的地址,然后通过*cpp = &c的操作将指针p的值赋为常量c的地址。这样,做最后一个语句后,即*p=0,常量c的值就会变为0。这样就间接地修改常量c的值。

如果将const char** cpp改为const char * const *cpp;的话就可以安全地指向p的地址了。因为此时,cpp无法通过使用*cpp = &c来修改p的值,因为此时cpp的类型中char*类型被const修饰了。

C/C++标准所指定的规则还是非常可靠的。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值