关于C语言类型相容的问题?

wuyuwww 2011-05-30 11:40:51
下面摘自C专家编程:
char *cp;
const char *ccp;
ccp=cp;
左操作数是一个指向有const限定符的char的指针。
右操作数是一个指向没有const限定的char的指针
char类型与char类型是相容的。
综上所述char *cp和const char *ccp类型相容



char**和const char**,他们所指向的类型不一样(前者指向char*,后者指向const char *);因此char**和const char**是不相容的。


我怎么感觉这个书上的解释也是如此的牵强富贵了,在考虑char *cp和const char *ccp是否相容的时候没有考虑指向是否有限定,但是在考虑char**和const char**是否相容的时候又考虑了指向的限定问题?这个号费劲啊

请高手回答一下啊,要说出自己的体会而不是贴那些课本上的东西,我的课本都有的

...全文
379 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
BT_Dana 2011-11-03
  • 打赏
  • 举报
回复
最后一句话是没用的。。 大家忽略掉吧。。
BT_Dana 2011-11-03
  • 打赏
  • 举报
回复
函数调用有个赋值过程(形参为左值,实参为右值),所以需要满足赋值的约束条件:
两个操作数都是指向有限定符或无限定符的相容类型的指针,
左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。

先写总结,如下:(第二行的变量都可以作为右值赋值给第一行)
(1)const char * ccp: ccp是个指向 有const修饰的 char 的指针。
(2) char * cp: cp是个指向 没有const修饰的 char 的指针。

(3)char *const * ccpp: ccpp是个指向 有const修饰的 指针(指向char) 的指针。
(4)char * * cpp: cpp是个指向 没有const修饰的 指针(指向char) 的指针。

(5)const char *const * cccpp: cccpp是个指向 有const修饰的 指针(指向const char) 的指针。
(6)const char * * ccpp: ccpp是个指向 没有const修饰的 指针(指向const char) 的指针。

对于(1)和(2),char和char是相容类型,(1)具有(2)的全部限定符,所以赋值合法。
对于(6)和(4),指向const char的指针和指向char的指针是不相容的,所以赋值不合法,(3)和(4)才是“一对儿”。

所以通常我们的char*都可以传递给const char*
而如果想传递char**,形参需要声明为char *const *

C专家编程:
这个约束条件很令人恼火,非常容易让用户混淆。所以,这种赋值方法目前在基于Cfront的C++翻译器中是合法的。

不知道现在还合不合法了,试了下在VC6的c工程下不报错,VC6.0和vs2008的C++工程,都是直接报错的,而不是警告。
所以感觉不是非常必要,使用char **时,还是避免形参和实参类型不一样吧。。
毕竟标准规定了这是不合法的。。
 没有const修饰的 指针(指向const char) 的指针。
wuyuwww 2011-06-24
  • 打赏
  • 举报
回复
我是比较客观的,如果回答的让我理解了某些东西,或张了知识一定给分,但是随便达达的坚决不给分的!
薛定谔之死猫 2011-05-30
  • 打赏
  • 举报
回复
容与不容,使用时候再做试验判定,有情帮顶
wuyuwww 2011-05-30
  • 打赏
  • 举报
回复
楼上说调一下就出来,这个不好吧,我个人呢认为还是理解的比较好吧,以为很多程序要自己理解的吧,


还有看C++标准,关于这个的C++标准我都可以背出来,正因为标准不好理解才提问的
ljt3969636 2011-05-30
  • 打赏
  • 举报
回复
这个我建议楼主看下C++标准 4.4
wlmjxj 2011-05-30
  • 打赏
  • 举报
回复
调一下就看出来了
bdmh 2011-05-30
  • 打赏
  • 举报
回复
CrackValue 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 little_sand 的回复:]

友情帮顶
[/Quote]
++
赵4老师 2011-05-30
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
little_sand 2011-05-30
  • 打赏
  • 举报
回复
友情帮顶
wuyuwww 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 rylzx_xzz 的回复:]
char *cp;
const char *ccp;
给楼主解释一下,不过别老是不揭帖。
这里变量cp的内容,例如(0x0001吧)就是某个字符的地址,所以你可以通过*p(也就是取地址为0x0001的内存单元的内容:一个字符)引用这个字符,类似地,*ccp也是这个效果,但是有一点不同:你可以改变cp指向的内容,但是改变不了*ccp的内容,因为*ccp的内容是const,是不可改变的。

……
[/Quote]


问题就出在这个地址上面,这个地址是个const型,也就是说是个常量地址,(*cppv)的值是个常量
这个怎么变成常量了啊,我的理解是指向具有const限制的char地址
AnYidan 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bdmh 的回复:]
char *p 和 const char* p,p都是执行char类型

char **p 和 const char **p,这个指向的char*,是指针类型,而char* 和 const char* 是不能等同的
[/Quote]


char **p 指向char*,
const char **p 指向 const char *
char* 与 const char * 不兼容


指针的兼容性不能继承
飞天御剑流 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wuyuwww 的回复:]
楼上的,我会找出让你的推理自相矛盾的地方的,我先去吃饭,
[/Quote]

................这不是“推理”,这是标准的内容。

晚上有事,十一点之后再说吧,这几个小时你可以自个好好想想,也希望你能跨过这道槛。
wuyuwww 2011-05-30
  • 打赏
  • 举报
回复
楼上的,我会找出让你的推理自相矛盾的地方的,我先去吃饭,
飞天御剑流 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wuyuwww 的回复:]
至少不能去细细推敲,不然绝对搞死在里面
[/Quote]

从新手到高手总要经过一些“门槛”,这些“门槛”你过不了,就永远是新手。
飞天御剑流 2011-05-30
  • 打赏
  • 举报
回复
下面这两个二级指针才是可以赋值的:

int * const * = int **

好好看看区别。
飞天御剑流 2011-05-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wuyuwww 的回复:]
我觉得这个玩意是理解不了了,only memory,都是规则只适合某种情况,但却还叫规则,矛盾,只是不能去细细琢磨和推敲
[/Quote]

这个东西其实就是两条,有何理解不了呢?对于赋值运算符两边的存在cv修饰符的指针,就是两条规则:

1。两个指针指向相容类型;
2。赋值运算符左边的指针要比右边的更严格。

const int * = int *符合上述两条要求,因为两者都是指向int的指针,而左边的由于多了一个const,比右边的严格。

但对于const int ** = int **来说,两边的指针所指向的类型是不相容的,一边是const int *,另一边是int *,跟上述两边都是int不同,因此不能隐式转换。
wuyuwww 2011-05-30
  • 打赏
  • 举报
回复
至少不能去细细推敲,不然绝对搞死在里面
wuyuwww 2011-05-30
  • 打赏
  • 举报
回复
我觉得这个玩意是理解不了了,only memory,都是规则只适合某种情况,但却还叫规则,矛盾,只是不能去细细琢磨和推敲
加载更多回复(7)

70,037

社区成员

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

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