const修饰的双重指针赋值解惑

本文详细解析了C语言中指针赋值过程中遇到const修饰符时的特殊情况,通过实例展示了编译错误的原因及解决方法。

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

在c程序中,我们可能经常会使用到指针之间的赋值。

传统的赋值操作:

char *cp = "c";
const char *ccp;
ccp = cp;
printf("*ccp:%c",*ccp);

会正常打印出*cpp所指的字符。但是下面的这段代码,就会出现问题:

char **c = &cp;
const char **cc;
cc = c;
printf("**cc:%c",**cc);

编译的时候提示,出现错误:

1>------ 已启动生成: 项目: oj1511, 配置: Debug Win32 ------
1>生成启动时间为 2014/4/9 10:48:221>InitializeBuildStatus:
1>  正在创建“Debug\oj1511.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
1>ClCompile:
1>  oj1510.cpp
1>e:\workspace\oj1511\oj1511\oj1510.cpp(11): error C2440: “=”: 无法从“char **”转换为“const char **1>          转换丢失限定符
1>
1>生成失败。
1>
1>已用时间 00:00:00.36
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

这是为什么呢?


原来还是const修订符搞的怪:

第一段代码中:

cp是一个指向char类型的指针。

ccp是一个const修饰符修饰的指向char类型的指针,也就是说,它指向的是char类型,但是指针本身是不可修改的。

 

在ANSI C标准中,有这么一段:

两个操作数都是指向有限定符或无限定符的相容类型的指针,左边的指针所指向的类型必须具有右边的全部限定符。

也就是说: ccp是一个指向有const修饰符的指针,cp是一个指向没有const修饰符的指针。ccp中包含了cp的所有修饰符(其实cp就没啥修饰符),因此可以进行赋值。

 

这样,我们看一下面的代码:

c是一个指向char类型指针的指针。

cc是一个指向const修饰符修饰的char类型的指针的指针。

cc 与 c指向的内容并不相同,因此无法进行赋值操作。因此出现提示错误:error C2440: “=”: 无法从“char **”转换为“const char **”

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值