你怎么能把指针转换成一个整数,但不是一个双精度? (C)

时间:2014-07-21 16:56:45

标签: c pointers casting

我正在做一个随机练习,给定一个整数数组和双数组,你应该计算一个整数和一个双精度的大小。

对于整数大小,我只使用两个指针指向两个相邻的数组,然后我找到它们的区别。因为指针算法将此计算为1的差值,所以我将指针转换为整数,因为我假设指针会明确地引用4个字节的内存,并且得到了正确的结果(4)。

现在,我为双打尝试同样的事情,但我收到此错误:pointer value used where a floating point value was expected

可能的猜测是双精度数是8个字节,而指针是4个字节。但我不确定这是否真的很重要。

任何见解?

我的确切行:

int doubSize = (double)doubPtr2 - (double)doubPtr1;
//where doubtPtr1 and doubPtr2 poiny to two adjacent indexes of double array

3 个答案:

答案 0 :(得分:4)

该标准允许将指针转换为整数类型,但除非类型足够大,否则返回将不会恢复原始指针。尽管如此,实际的映射是实现定义的,但有人建议它应该模仿底层的内存架构,这严重限制了这样做的实用性。浮点类型没有这样的许可 请查看intptr_t以获得保证足够大的类型。

无论如何,更好(和正确)的方法是获取指向相邻数组元素的指针,将它们转换为char*char保证为一个字节大,不保证一个字节一个八位字节),而不是减去它们。 (对于运营商而言,结果类型应为size_t

这预先假定,对于你的练习,sizeof被任意禁止,否则这将是这里的首选解决方案。

答案 1 :(得分:0)

将双指针投射到一个双重指针上并没有做你认为它正在做的事情,或者至少我认为它不是......比如看看:

int main(int argc, char *argv)
{
  double *a;
  double *b;
  double dummy[3];
  a = &dummy[0];
  b = &dummy[1];

  int *ai;
  int *bi;
  int dummyi[3];
  ai = &dummyi[0];
  bi = &dummyi[1];
  char *ac;
  char *bc;
  ac = (char *)a;
  bc = (char *)b;
  printf("Check for double: %d vs %d\n",sizeof(double),bc-ac);
  ac = (char *)ai;
  bc = (char *)bi;
  printf("Check for int: %d vs %d\n",sizeof(int),bc-ac);


}

(打印出来:

Check for double: 8 vs 8
Check for int: 4 vs 4

答案 2 :(得分:0)

你是在思考它。指针是一个地址,只是一个数字。当你有一个任何类型的数组时,每个数组都在下一个可用的地址。因此,要找出类型的大小,您只需要数组中相邻条目的地址。

double tmp[2];
int size = (char *)(&(tmp[1])) - (char *)(&(tmp[0]));

地址必须强制转换为char *,以便通过将地址空间视为存储字节而不是数据类型来获取数据类型的第一个字节的地址。