user-0 提问: 相容类型的相容如何理解

回复:
user: user-1

user: user-1
content: 引用 10 楼 qq_29120981 的回复:[quote=引用 8 楼 均陵鼠侠的回复:] const char **和char **相不相容暂且不说，但它们符合除相容之外的所有条件。两个操作数都是指向无限定符，左边指针的指向类型(const char *)具有右边指针指向类型(char *)的全部限定符[/quote]  你只知其一，不知其二。类型兼容（相容）是一回事，赋值是另一回事。左边指针的指向类型具有右边指针指向类型的全部限定符是赋值表达式的额外要求，和两个类型是否兼容还不一样。

user: user-1
content: 引用 9 楼 qq_29120981 的回复:[quote=引用 7 楼 fefe82的回复:]相同的类型是相容的。不同的类型通常是不相容的。  const char ** 与 char ** 被指向的类型为 const char* 与 char * 左右指向的是无限定符的不相容类型(const char * 与 char *)  const char * 与 char * 被指向的类型为 const char 与 char 左右指向的是有限定符(const) 和 无限定符的相容类型(均为 char)，且左侧有右侧的全部限定符。  注意这里是对指针指向的类型的要求，而不是要求两个指针类型本身的要求。 const int a，这个a的类型算int 还是算const int？如果算const int那问什么const char *和char *(前者指向const char后者指向char)明明指向的类型不同为何还要说它们指向相同类型char？如果算int，那么const char **和char **(前者指向const chat *后者指向char *)所指向的类型就都是char *？？[/quote]  1，在C中，任何类型和它的限定版本都是截然不同的类型，因此，int和const int是不同的类型，这点没有任何疑问。 2，const char *和char *是不同的类型。因为这两个指针指向的类型不同。 3，const char * *和char * *也是不同的类型，前者指向const char *，后者指向char *。两个指针兼容的唯一条件是它们指向的类型是兼容的。

user: user-2
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-0
content: 引用 11 楼 fefe82的回复:const char * 与 char * 是不相容的类型。因为他们指向的类型（一个是 const char ，一个是 char ），不同。  他们不是有限定符和无限定符的相容类型：char * 加上 const 限定符是 char *const ； const char * 加上const 限定符是 const char * const 。  const char * 与 char * 都没有（顶层的） const 限定符。  =====  const int a1; int const a2; const int *pa3; int const *pa4; int *const pa5;  a1 与 a2 类型是相同的。 pa3 与 pa4 的类型是相同的。 但 pa5 具有与 pa3 和 pa4 不同的类型。  a1 a2 pa5 是有（顶层的）限定符的，但是 pa3 和 pa4 没有（顶层的）限定符。  pa3 和 pa4 只是指向了一个有限定的类型，但是他们本身并没有限定符。 感谢大家的回答，我想这篇博文能够解答我的疑问了 blog.csdn.net/code_crash/article/details/4854974

user: user-0
content: 引用 11 楼 fefe82的回复:const char * 与 char * 是不相容的类型。因为他们指向的类型（一个是 const char ，一个是 char ），不同。  他们不是有限定符和无限定符的相容类型：char * 加上 const 限定符是 char *const ； const char * 加上const 限定符是 const char * const 。  const char * 与 char * 都没有（顶层的） const 限定符。  =====  const int a1; int const a2; const int *pa3; int const *pa4; int *const pa5;  a1 与 a2 类型是相同的。 pa3 与 pa4 的类型是相同的。 但 pa5 具有与 pa3 和 pa4 不同的类型。  a1 a2 pa5 是有（顶层的）限定符的，但是 pa3 和 pa4 没有（顶层的）限定符。  pa3 和 pa4 只是指向了一个有限定的类型，但是他们本身并没有限定符。 感谢大家的回答，我想这篇博文能够解答我的疑问了 blog.csdn.net/code_crash/article/details/4854974

user: user-3
content: 参数是 const 只是说明它“保证”不会修改（至于真的不会不会修改，我们不关心），那么把一个本来可以修改的内容传递给一个保证不会修改你内容的参数，这是可以理解的。然而把一个 const 内容，即本身不可修改的内容，传递给一个一定会修改内容的参数，导致你的只读数据被修改了，程序可能会崩溃。

user: user-4
content: const char * 与 char * 是不相容的类型。因为他们指向的类型（一个是 const char ，一个是 char ），不同。  他们不是有限定符和无限定符的相容类型：char * 加上 const 限定符是 char *const ； const char * 加上const 限定符是 const char * const 。  const char * 与 char * 都没有（顶层的） const 限定符。  =====  const int a1; int const a2; const int *pa3; int const *pa4; int *const pa5;  a1 与 a2 类型是相同的。 pa3 与 pa4 的类型是相同的。 但 pa5 具有与 pa3 和 pa4 不同的类型。  a1 a2 pa5 是有（顶层的）限定符的，但是 pa3 和 pa4 没有（顶层的）限定符。  pa3 和 pa4 只是指向了一个有限定的类型，但是他们本身并没有限定符。

user: user-0
content: 引用 8 楼 均陵鼠侠的回复: const char **和char **相不相容暂且不说，但它们符合除相容之外的所有条件。两个操作数都是指向无限定符，左边指针的指向类型(const char *)具有右边指针指向类型(char *)的全部限定符

user: user-0
content: 引用 7 楼 fefe82的回复:相同的类型是相容的。不同的类型通常是不相容的。  const char ** 与 char ** 被指向的类型为 const char* 与 char * 左右指向的是无限定符的不相容类型(const char * 与 char *)  const char * 与 char * 被指向的类型为 const char 与 char 左右指向的是有限定符(const) 和 无限定符的相容类型(均为 char)，且左侧有右侧的全部限定符。  注意这里是对指针指向的类型的要求，而不是要求两个指针类型本身的要求。 const int a，这个a的类型算int 还是算const int？如果算const int那问什么const char *和char *(前者指向const char后者指向char)明明指向的类型不同为何还要说它们指向相同类型char？如果算int，那么const char **和char **(前者指向const chat *后者指向char *)所指向的类型就都是char *？？

user: user-1

user: user-4
content: 相同的类型是相容的。不同的类型通常是不相容的。  const char ** 与 char ** 被指向的类型为 const char* 与 char * 左右指向的是无限定符的不相容类型(const char * 与 char *)  const char * 与 char * 被指向的类型为 const char 与 char 左右指向的是有限定符(const) 和 无限定符的相容类型(均为 char)，且左侧有右侧的全部限定符。  注意这里是对指针指向的类型的要求，而不是要求两个指针类型本身的要求。

user: user-0
content: 引用 4 楼 user-5的回复:http://bbs.csdn.net/topics/330029633 看完整个帖子后，我还是懵懂。说到底就是下面这不理解: 书上说const char**和char**不相容的原因是前者指向const char*后者指向char*，这是两个不同的类型。那么问题来了，const char *和char *，前者指向const char，后者指向char，这应该是两个不同的类型啊。为何这两个又相容呢？

user: user-0
content: 书上说const char**和char**不相容的原因是前者指向const char*后者指向char*，这是两个不同的类型。那么问题来了，const char *和char *，前者指向const char 后者指向char。为何这两个又相容呢

user: user-5
content: http://bbs.csdn.net/topics/330029633

user: user-0
content: 引用 2 楼 赵4老师的回复:在我眼里，任何类型都是相容类型！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 既然老师认为都是相容的那为何把char ** 类型的指针赋给const char **p会warning呢？

user: user-2
content: 在我眼里，任何类型都是相容类型！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: 很抱歉，楼主手机版不能发帖后用网页版发帖没想到一连发了三个...对于版面的印象只能跟大家说声对不起了，还有，谁知道如何删帖吗？对于题主的问题在这个帖讨论吧，我正在找方法把发重的帖子删掉。万分抱歉