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

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

传统的赋值操做:spa

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);

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

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 个 ==========

这是为何呢?blog


原来仍是const修订符搞的怪:it

第一段代码中:编译

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

ccp是一个const修饰符修饰的指向char类型的指针,也就是说,它指向的是char类型,可是指针自己是不可修改的。配置

 

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

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

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

 

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

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

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

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

相关文章
相关标签/搜索