====== 赋值转换(Assignment conversions) ====== 赋值表达式两边的表达式类型应该是一样的,当不一样时,则发生转换。 需要特别关注的是指针赋值规则:左边指针指向的类型必须拥有右边指针指向类型的所有类型限定符(type qualifier),此外,左边指向的类型要与右边指向类型相兼容(参见:[[.:type_compatibility|类型兼容性]])。即: T1 *p; T2 *q; p = q; T1类型要有T2类型的所有限定符,并且T1与T2(去除限定符后)兼容。 例如: char *a = "abcd"; const char *b; b = a; 这里T1为const char,T2为char,T1拥有T2的所有限定符,此外,char与char兼容,所以该赋值操作是合法的。 但下面这个例子就不行: char *str = "abcd"; char **a = &str; const char **b; b = a; 编译器会产生类似的警告信息:warning: assignment from incompatible pointer type(从不兼容的指针类型赋值)。 原因如下: * T1类型是const char *; * T2类型是char *; * T1与T2都没有类型限定符,这里const char *是一个指向具有const限定符的char类型的指针,即const修饰的是char,不是指针本身; * T1与T2不兼容,因为const char与char不兼容。 如下的代码就合法了(分析方法同上): char *str = "abcd"; char **a = &str; char * const *b; b = a; {{tag>C语言}}