赋值转换(Assignment conversions)

赋值表达式两边的表达式类型应该是一样的,当不一样时,则发生转换。

需要特别关注的是指针赋值规则:左边指针指向的类型必须拥有右边指针指向类型的所有类型限定符(type qualifier),此外,左边指向的类型要与右边指向类型相兼容(参见:类型兼容性)。即:

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(从不兼容的指针类型赋值)。

原因如下:

如下的代码就合法了(分析方法同上):

char *str = "abcd";
char **a = &str;
char * const *b;
 
b = a;