为什么char **可以转换为const char*const*

failuer 2011-10-10 02:38:12
感觉不应该啊,因为char **不可以转换为const char**
为什么在两个*之间加个const就可以转换了?
...全文
1549 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
DimerChan 2011-10-12
  • 打赏
  • 举报
回复
mark,记起来学习
aaaa1233 2011-10-11
  • 打赏
  • 举报
回复
23楼正解,而且讲得很清楚!
追求执着 2011-10-11
  • 打赏
  • 举报
回复

坐等大牛分析!!
kissthefuture 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 pengzhixi 的回复:]

理解的关键将char**作为(char*)*对待,然后看const修饰的对象。
[/Quote]

yes 这才是最通俗的理解方法,受教了
kissthefuture 2011-10-11
  • 打赏
  • 举报
回复
const 就近修饰, 然后你就明白了
fei324 2011-10-11
  • 打赏
  • 举报
回复

明确const修饰的对象!如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

C++ 对于指针p1,和p2,若要使得p2=p1成立,则可读做 :
“p1是指向X类型的指针,p2是指向“带有const限定”的X类型的指针 “。
char *p1;const *p2=p1;//合法:p1是指向(char)类型的指针,p2是指向“带有const限定"的(char)类型的指针。

char **p1;const char**p2=p1;//不合法:p1是指向(char*)类型的指针,p2是指向 ((const char)*)类型的指针。

char **p1;char const**p2=p1;//不合法;与上等价。

char**p1;char*const*p2=p1;//合法: p1是指向(char *)类型的指针,p2是指向“带有const限定"的(char*)类型的指针。

这是C++语法规则,在C中因为char **可以转换为const char**
赵4老师 2011-10-10
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
飞天御剑流 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 failuer 的回复:]
引用 9 楼 supermegaboy 的回复:
const char *才可以转换为const char * const *,或者char * 转换为char * const *也可以。
---------------------------------------------------------------------------------
晕,漏了个*,此句修改为:


c……
[/Quote]

知道怎么回事了。看了一下C++的标准,原来这个问题C和C++是不一样的。C++是这样规定的:

4.4 Qualification conversions

A conversion can add cv-qualifiers at levels other than the first in multi-level pointers, subject to the following rules:51)

Two pointer types T1 and T2 are similar if there exists a type T and integer n > 0 such that:

T1 is cv1 , 0 pointer to cv1 , 1 pointer to . . . cv1 ,n − 1 pointer to cv1 ,n T

and

T2 is cv2 , 0 pointer to cv2 , 1 pointer to . . . cv2 ,n − 1 pointer to cv2 ,n T

where each cvi, j is const, volatile, const volatile, or nothing. The n-tuple of cv-qualifiers after the first in a pointer type, e.g., cv1 , 1 , cv1 , 2 , . . . , cv1 ,n in the pointer type T1, is called the cvqualification signature of the pointer type. An expression of type T1 can be converted to type T2 if and only if the following conditions are satisfied:

— the pointer types are similar.
— for every j > 0, if const is in cv1 , j then const is in cv2 , j, and similarly for volatile.
if the cv1 , j and cv2 , j are different, then const is in every cv2 ,k for 0 < k < j.

与你的问题有关的就是最后红色那一点。当cv1,j和cv2,j不相同的时候,只要处于0--j之间的指针都有const修饰,那么就是合法的。

你的问题就是因为cv1,1和cv1,2不同,但cv2,0有const,所以可以转换。类似地,如下这些情况在C++中都可以转换:

char *** 和 const char * const * const *;
char **** 和 const char * const * const * const *;

但如下情况不能转换:

char *** 和 const char * * const *或者 const char * const ** 等等。
failuer 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 pengzhixi 的回复:]
理解的关键将char**作为(char*)*对待,然后看const修饰的对象。
[/Quote]
恩,单独的const char*const*是知道那个修饰那个的
但是涉及到和另外一个转换的时候就会有点不明白了
pengzhixi 2011-10-10
  • 打赏
  • 举报
回复
理解的关键将char**作为(char*)*对待,然后看const修饰的对象。
luciferisnotsatan 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pengzhixi 的回复:]

引用 10 楼 luciferisnotsatan 的回复:
引用 7 楼 pengzhixi 的回复:

const char**;
当遇到这个的时候我们应该分开来看的。
(const char*)*;
这样意味着这个二级指针指向的类型是const char*
而当我们直接将一个char*指针本身的地址付给它的时候意味着 编译器要先将char*转换成const char*之后再将……
[/Quote]
char **p1 = NULL;
const char *const *p2 = p1;

vs和g++都能编过。

char **p1 = NULL;
const char **p2 = p1;
就错了。

我也不理解为啥上面的就成功了,难道是文法语法分析时有盲点或者有啥二义性?
failuer 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pengzhixi 的回复:]
引用 10 楼 luciferisnotsatan 的回复:
引用 7 楼 pengzhixi 的回复:

const char**;
当遇到这个的时候我们应该分开来看的。
(const char*)*;
这样意味着这个二级指针指向的类型是const char*
而当我们直接将一个char*指针本身的地址付给它的时候意味着 编译器要先将char*转换成const char*之后再将转……
[/Quote]
你在7楼的回答是针对我的问题的
但是我没看明白你回答的下半部分,有点绕
failuer 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 luciferisnotsatan 的回复:]
引用 7 楼 pengzhixi 的回复:

const char**;
当遇到这个的时候我们应该分开来看的。
(const char*)*;
这样意味着这个二级指针指向的类型是const char*
而当我们直接将一个char*指针本身的地址付给它的时候意味着 编译器要先将char*转换成const char*之后再将转换后的const char*指针本身的地址付它。这就会编译器拒绝……
[/Quote]
对,就这个意思
我表达能力很差,呵呵
failuer 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 supermegaboy 的回复:]
const char *才可以转换为const char * const *,或者char * 转换为char * const *也可以。
---------------------------------------------------------------------------------
晕,漏了个*,此句修改为:


const char **才可以转换为const ch……
[/Quote]
DEV 和VC6都可以将
char **转换为const char *const *
luciferisnotsatan 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 supermegaboy 的回复:]

引用楼主 failuer 的回复:
感觉不应该啊,因为char **不可以转换为const char**
为什么在两个*之间加个const就可以转换了?


你用了什么编译器?

char **肯定是不可以转换为 const char * const *的,因为const char *和char *不是相容的类型。

const char *才可以转换为const char *……
[/Quote]
我用vs2005和g++都试了,char**能转const char * const *

pengzhixi 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 luciferisnotsatan 的回复:]
引用 7 楼 pengzhixi 的回复:

const char**;
当遇到这个的时候我们应该分开来看的。
(const char*)*;
这样意味着这个二级指针指向的类型是const char*
而当我们直接将一个char*指针本身的地址付给它的时候意味着 编译器要先将char*转换成const char*之后再将转换后的const char*指针本身的地址付它。这就会编译器拒绝……
[/Quote]
如果我没猜错的话 他就使用了我11楼类似的代码形式。
pengzhixi 2011-10-10
  • 打赏
  • 举报
回复
对于char*p="hello"; 这种是将p的地址赋给 const char*const*的。
luciferisnotsatan 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhixi 的回复:]

const char**;
当遇到这个的时候我们应该分开来看的。
(const char*)*;
这样意味着这个二级指针指向的类型是const char*
而当我们直接将一个char*指针本身的地址付给它的时候意味着 编译器要先将char*转换成const char*之后再将转换后的const char*指针本身的地址付它。这就会编译器拒绝。这个不属于标准转换。编译器自然会拒绝。

……
[/Quote]
lz指的是 const char*const* 中间多了一个const为什么就成功了。
飞天御剑流 2011-10-10
  • 打赏
  • 举报
回复
const char *才可以转换为const char * const *,或者char * 转换为char * const *也可以。
---------------------------------------------------------------------------------
晕,漏了个*,此句修改为:


const char **才可以转换为const char * const *,或者char ** 转换为char * const *也可以。
飞天御剑流 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 failuer 的回复:]
感觉不应该啊,因为char **不可以转换为const char**
为什么在两个*之间加个const就可以转换了?
[/Quote]

你用了什么编译器?

char **肯定是不可以转换为 const char * const *的,因为const char *和char *不是相容的类型。

const char *才可以转换为const char * const *,或者char * 转换为char * const *也可以。
加载更多回复(7)

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧