我有两种形式,实际输出不同的结果,我不明白
int x = *(int*)&M[index]
与
相比 int x = (int)M[index]
有人可以向我解释有什么区别吗?
答案 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的元素。”
在您的示例中,假设M
是int
数组,则转换完全没有必要,应该删除。你也可以使用:
int x = *(&M[index]);
这种形式的另一个好处是使两部分更清晰;第一部分只是括号外的*
运算符,第二部分是括号内的代码。
或
int x = M[index];
后一种形式是首选的形式,它是明确的和重点。