char** To const char**

char** To const char**
cannot convert from type "char**" to "const char**", but why?
any instances?
所有人都理解错了,思维定式,太小看这个问题了,或许你们从没接触过这个问题,程序很简单:
char ** ptr1 = NULL;
const char** ptr2 = ptr1;
仅此两行。
问题已经得到解答:http://www.dutor.net/index.php/2009/07/from-const-char/

不过jljl...的回答还是很有价值的。
一个可能的原因,const char* 和java 中String 的内含物有类似行为,
虽然 const char*不会影响到 char *,但如果 const char*被缓存了 (虽然看上去不太会发生,但还是有可能,比如
const char *p;
if (*p) putchar(*p);
这个例子中,因为const char *p,所以(*p)可能被寄存器缓存了,
在多线程中,或者 volatile char *,都有可能使 (*p)缓存出现不一致的情况。

另一可能,也许跟你的程序有关,你觉得编译器在试图char** To const char**,但实际上可能不是,你的描述可能与程序语义有出入。

------------------ 补充
确实疏忽了,仔细一想确实是不能转换的,原因如下:

首先,char *可以被视为const char *的子类:
const char *p = (char *)q;
但反过来却不行:
char *q = (const char *)p;
同时,指向类型T的指针可以被看成是指向T数组第一个单元的指针,数组是锋哪容器的一种,

下面来说明,为什么关于T的容器类T'不能作为关于T的子类S的容器类S'的父类:

我们知道,T'中的操作数类型为T,而S是一种T,所以T'可以接受所有的S。
如薯薯果T'是S'的父类,那么我们就可以把S'当作T'来处理,那么S'也就可以接受所有T的子类(包括T和S),显然这是向银手码下转型,是不安全的。
我确实弄错题意了...

正确理由如下:

char** ptr1是尺裂一个指针,指向一个指向char的指针...
const char** ptr2也是一个指针,但是指向的是一个指向const char的指针...

因为ptr1和ptr2指向的都是陵祥闭指针,但是指向的指针类型却不宴链一样...所以不能转换...
char**是指向char*的指针,而
const char **是指向const char*的指针,
不能错误地认为前兆丛贺面加了const,就表示是郑桐一个二级常量指针.它族派实际上表示的是所指向的一级指针是个常量.
常量指针不可赋值给非常量指针,除非进行显示类型转让历换,因为常量指针乎滑余指向的是常量,是不可修改的。常量指针赋给非常量指岁滚针后,指针指向的内容将可通过指针进行修改。
example:
#include

void main()
{
int a = 5, *p;
const int *q;

p = &a; /* right */
q = &a; /* right */
p = q; /* wrong */
p = (int *)q; /* right */
}
because you var "const char **" not "char **".const can't change,
← 上一篇: 下一篇: →