兼容类型(二)
二、数组类型的兼容性
如果两个数组类型是兼容的,应满足以下条件:
- 数组元素的类型应是兼容的;
- 数组的维数应是相同的;
- 如果两个数组大小说明符都存在,并且是整数常量表达式,则两个大小说明符应具有相同的常量值;变长数组和其它数组是兼容的。
extern int n; { int a[5]; int b[5]; int c[6]; double d[5]; int f[n]; }
其中数组a、b的类型是兼容类型;数组a、b的类型与数组c的类型是不兼容的,因为数组大小说明符不相等;数组a、b的类型与数组d的类型是不兼容的,因为数组元素的类型不兼容;数组f的类型与数组a、b、c的类型都是兼容的,因为数组f是变长数组,只要满足数组元素兼容和数组维数相同就可以了;数组f的类型与数组d的类型是不兼容的,因为数组元素的类型不兼容。
int a[20]; int b[4][5]; int c[2][10];
数组a与数组b、c的类型是不兼容的,因为它们的数组维数是不相同的。数组b与数组c的类型是不兼容的,因为数组大小说明符不相等。
如果存在类型限定符,类型限定符的情况和基本类型相同。
三、指针类型的兼容性
对于兼容的两种指针类型,两者应具有相同的类型限定符,并且都应是指向兼容类型的指针。
int *a = NULL; int *b = NULL; int (*c)[5] = NULL; int (*d)[5] = NULL;
指针a、b的类型是兼容的;指针c、d的类型是兼容的,指针a、b与指针c、d的类型是不兼容的。指针a、b都是指向int类型对象的指针;指针c、d都是指向有5个int类型元素的数组的指针。
如果存在类型限定符,兼容指针类型的类型限定符应该是相同的,并且其指向实体的类型也是兼容的。
对于指针,如果存在类型限定符,应注意类型限定符限定的对象:
int number = 0; const int *a = 0; int * const b = &number; int * volatile c = 0;
以const类型限定符为例,如果类型限定符出现在*号的左边,则是限定指针指向对象的类型,表示指针指向的对象值是不变的;如果类型限定符出现在*号的右边,则是限定指针,表示指针指向的位置是不变的;这两种类型的指针是不兼容的。
指针a表示指向的对象值是不变的;指针b表示指向的内存位置是不变的,即只能指向变量number的地址。指针a与指针b的类型是不兼容的。指针b与指针c的类型也是不兼容的,因为其类型限定符不同。
对于多个类型限定符,类型限定符的先后顺序不影响类型的兼容性,前提是它们都在*号的左边或者右边。