2009-04-14 64 views
2

我在阅读有关“我的编程语言”类中的“类型等价”的内容,并且我遇到了C中的一种情况,我不确定。int数组的大小对类型等价性的影响

它描述C'S“类型等效”为:

C使用类型等价的一种形式,名称和结构等价之间落下,并且其可以被松散地描述为“名称等价于结构和联合的,结构等同于其他一切。“

那么,如果我有两个不同大小的数组,但相同的基本类型:

typedef int A1[10]; 
typedef int A2[20]; 

因为所有我需要的是结构等价,可能这两个被认为是结构上等同?在C中,索引集的大小是数组类型的一部分还是不是?

回答

3

不,他们不是。

您可以尝试sizeof(A1)sizeof(A2)并查看它们是不同的。

2

不,它们不是同一类型。

在C,你不会得到一个错误,但在C++中,如果你尝试,你会得到一个错误这样的:

错误C2440:初始化:不能从“诠释()转换[ 1024]”到 'INT()[512]'

下面是一些示例代码

int x[1024]; 
int y[512]; 
/*Create a pointer int[1024] type*/ 
int (*px)[1024] = &x; 
/*Create a pointer int[512] type*/ 
int (*py)[512] = &y; 

int (*py2)[512] = &x; /*<---compiling error in C++ but allowed in C even know it's wrong*/ 

即使知道最后一行被允许在C中, 2种类型被认为是不同的。另外一个数组与指向数组的指针不同,但正如您所看到的,类型声明是不同的。

+0

但是在我的书中,它指出指针在C中在结构上是等价的。所以,如果一个数组是指向n个元素的指针,那么它们在结构上是不是等效的呢? – Mithrax 2009-04-14 19:56:34

+0

数组不是指针 - 它可以在某些情况下“分解”为指针,但它不等同于指针 – 2009-04-14 19:59:55

0

在源代码中,在某些上下文中,不同类型的变量在给定表达式中是兼容的,并且编译器将调用足够的魔力来执行正确的/期望的事情,例如将数组作为参数传递给期望一个指针。但这并不意味着这些内存布局是兼容的。看到问题 Pointer vs array in C, non-trivial difference我错过了。

我不太清楚你的书的意思是“结构等值”,但不知道这可能是指默认的整数提升(但似乎也包括数组?)。但无论如何整数推广是一个非常重要的问题,你应该花时间理解。下面的printf应根据这些规则来执行:

unsigned int i = 0; 
if (i < -1) { 
     printf("This line is printed!\n"); 
} 

C standard (ISO/IEC 9899:1990)包含具有标题“通常的算术转换”定义的行为的部分。标准不是免费的(相反,它的销售相当昂贵,因为ISO标准的价格是每页...),但是如果你搜索这个词,你应该能够找到一些有用的信息或报价。这些标准的一些草案是免费提供的,但威胁那些有很大不信任感的人,因为你不知道到底是什么改变了最终的标准。