====== 赋值转换(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语言}}