两种形式的C分配有什么区别

时间:2012-09-05 10:47:20

标签: c

我有两种形式,实际输出不同的结果,我不明白

 int x = *(int*)&M[index]

相比
 int x = (int)M[index]

有人可以向我解释有什么区别吗?

4 个答案:

答案 0 :(得分:2)

如果M的数据类型不是int [],它们可能不同,假设你有一个2(16位)短路数组,0x0123和0x4567。内存布局(大端)将/可能是;

0x01 0x23 0x45 0x67

在后一种情况下使用M [0],您将正确分配短整数,因为您已读取M [0]并将其转换为整数,0x00000123

在第一种情况下,你取M [0]的地址,而假设内存中有一个整数,那就是32位整数类型给出结果0x01234567(即所有4个字节都将被读取)

答案 1 :(得分:1)

前者解释&M[index]处的内存字节,好像int存储在那里并为您提供int

后者采用M[index]的数值并将其转换为int

如果M[index]的类型为int,则显然没有区别。

答案 2 :(得分:1)

第二个将值转换为int,这意味着它以有意义的方式转换它(并且如果无法转换将导致错误),第一个从一个位置获取sizeof(int)字节内存并将它们表示为int,即使这可能没有任何意义。

例如:

double a[10];
a[5] = 281907.2389727;
int x = *(int*)&a[5];
int y = (int)a[5];
printf("%d %d", x, y);

将输出(在我的机器/编译器上):

-189447571 281907

因为cast(int)将向下舍入double,而*(int *)将获取double的第一个sizeof(int)字节,并且“假装”它是一个整数 - 这当然不会给出一个有意义的结果,因为它们有不同的大小和二进制表示。

答案 3 :(得分:0)

你不理解的是什么部分?

第一个表达式由两个表达式组成:一个指针解除引用,以及一个计算结果为指针的表达式。 *(int *)是第一部分,它引用了必须遵循的指针,而&M[index]只是意味着“索引的地址:数组M的元素。”

在您的示例中,假设Mint数组,则转换完全没有必要,应该删除。你也可以使用:

int x = *(&M[index]);

这种形式的另一个好处是使两部分更清晰;第一部分只是括号外的*运算符,第二部分是括号内的代码。

int x = M[index];

后一种形式是首选的形式,它是明确的和重点。