是否可以将char指针指定给浮点值?

时间:2014-07-22 11:06:00

标签: c pointers char floating-point-conversion

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

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

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

    getch();
    return 0;   
}
  

编译错误:错误C2440:'初始化':无法转换   'float * __ w64'到'char *'

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

2 个答案:

答案 0 :(得分:5)

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

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 :(得分:1)

从语法上讲,它是正确的。这取决于编译器,有些编译器会抛出错误而有些编译器不会。使用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整数,这将在字符存储在2000位置时将地址2004赋予整数指针。现在,当您打印指针的值时,将打印2004处的字符而不是位置2001处的字符(如果指针的类型为char *,则您期望这样。)