当前位置: C语言 -- 专题 -- 兼容类型

兼容类型(二)

二、数组类型的兼容性

如果两个数组类型是兼容的,应满足以下条件:

数组元素的类型应是兼容的;

数组的维数应是相同的;

如果两个数组大小说明符都存在,并且是整数常量表达式,则两个大小说明符应具有相同的常量值;变长数组和其它数组是兼容的。


extern int n;
    
{
    int a[5];
    int b[5];
    int c[6];
    double d[5];
    int f[n];
}

其中数组ab的类型是兼容类型;数组ab的类型与数组c的类型是不兼容的,因为数组大小说明符不相等;数组ab的类型与数组d的类型是不兼容的,因为数组元素的类型不兼容;数组f的类型与数组abc的类型都是兼容的,因为数组f是变长数组,只要满足数组元素兼容和数组维数相同就可以了;数组f的类型与数组d的类型是不兼容的,因为数组元素的类型不兼容。


int a[20];
int b[4][5];
int c[2][10];

数组a与数组bc的类型是不兼容的,因为它们的数组维数是不相同的。数组b与数组c的类型是不兼容的,因为数组大小说明符不相等。

如果存在类型限定符,类型限定符的情况和基本类型相同。


三、指针类型的兼容性

对于兼容的两种指针类型,两者应具有相同的类型限定符,并且都应是指向兼容类型的指针。

int *a = NULL;
int *b = NULL;
int (*c)[5] = NULL;
int (*d)[5] = NULL;

指针ab的类型是兼容的;指针cd的类型是兼容的,指针ab与指针cd的类型是不兼容的。指针ab都是指向int类型对象的指针;指针cd都是指向有5int类型元素的数组的指针。


如果存在类型限定符,兼容指针类型的类型限定符应该是相同的,并且其指向实体的类型也是兼容的。

对于指针,如果存在类型限定符,应注意类型限定符限定的对象:

int number = 0;
const int *a = 0;
int * const b = &number;
int * volatile c = 0;

const类型限定符为例,如果类型限定符出现在*号的左边,则是限定指针指向对象的类型,表示指针指向的对象值是不变的;如果类型限定符出现在*号的右边,则是限定指针,表示指针指向的位置是不变的;这两种类型的指针是不兼容的。

指针a表示指向的对象值是不变的;指针b表示指向的内存位置是不变的,即只能指向变量number的地址。指针a与指针b的类型是不兼容的。指针b与指针c的类型也是不兼容的,因为其类型限定符不同。

对于多个类型限定符,类型限定符的先后顺序不影响类型的兼容性,前提是它们都在*号的左边或者右边。