【问题标题】:Is it possible to assign char pointer to float value? [duplicate]是否可以将 char 指针分配给浮点值? [复制]
【发布时间】:2014-07-22 11:05:59
【问题描述】:

我尝试在 Visual Studio 中执行以下代码:

int main()
{
    float f1 = 15.23;
    char *ptr = &f1;

    printf("%c", *(ptr));

    getch();
    return 0;   
}

编译错误:错误 C2440:“正在初始化”:无法从 'float *__w64' 到 'char *'

这有什么具体原因吗?为什么不允许?

【问题讨论】:

  • 如果没有显式转换,则不允许这样做,因为它很少是您想要的:float 不是char

标签: c pointers char floating-point-conversion


【解决方案1】:

您确实可以将每个对象视为一个字符数组。但是,您必须明确地转换指针:

float f = 1.5f;

char const * p = (char const *)&f;

for (size_t i = 0; i != sizeof(float); ++i)
{
    printf("The byte at position %zu has value %d.\n", i, (int)p[i]);
}

【讨论】:

  • +1 不错的转储循环。 C99 §6.3.2.3, p7C99 §6.5.4 以防有人认为这很糟糕(事实并非如此)。
  • @Kerrek SB:在某些情况下,我将整数地址 (int) 粘贴到期望指向 unsigned char 的指针的函数中,但我只得到一个警告就逃脱了;那怎么样?
【解决方案2】:

语法上是正确的。这取决于编译器,有些编译器会抛出错误,而有些则不会。您的代码在使用 Visual Studio 编译时会引发错误,但在使用 gcc 编译器编译时只会给您警告,并且您还会得到一个垃圾字符作为 gcc 的输出。

即使在语法上是正确的,您也不应该以上述方式分配指针,因为指针变量保存另一个变量的地址,并且所有地址都是整数。因此,当您使用char*float*int* 时,它们都存储无符号整数,但它们由类型区分。

考虑这段代码:

int a = 10;
char ch = 'a';
float f = 10.10;
int *ptr_int = &a;
char *ptr_char = &ch;
float *ptr_float = &f;

假设如果 a 存储在内存位置 1000,ch 存储在内存位置 2000,f 存储在位置 3000。现在如果在代码中有如下行

ptr_int++;
ptr_char++;
ptr_float++;

这些行将指针中的值分别更改为 ptr_int、ptr_char 和 ptr_float 的 1004、2001 和 3004。这种行为是因为 32 位系统中的整数大小为 4 字节,当我说 ptr_int++ 时,它将增加指向整数大小的指针的值,即 4 字节,类似地,ptr_char 值更改为 2001,因为字符大小是字节和 ptr_float由于浮点大小为 4 个字节,值更改为 3004。

现在考虑这些代码行

 char ch = 'a';
 float *ptr_int = &ch;
 ptr_int++;
 printf("%c",*ptr_int);

在上面的示例中,我们将字符变量的地址分配给整数指针,然后将指针值增加 1 个整数,这会将地址 2004 分配给整数指针,因为字符存储在 2000 位置。现在,当您打印指针的值时,将打印 2004 处的字符,而不是位置 2001 处的字符(如果指针是 char* 类型,您会期望它)。

【讨论】:

  • 这有什么具体原因吗?
  • 这不是有效的代码。
  • 此代码不正确。来自 gcc 的警告可以指示违反约束;如果某些东西用 gcc 编译,则不能保证它符合标准。您需要在严格符合的代码中进行显式转换,因为您不能在赋值表达式中使用指向不兼容类型的指针。
猜你喜欢
  • 2015-01-15
  • 2023-03-26
  • 2022-07-06
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2021-10-15
相关资源
最近更新 更多