我尝试在Visual Studio中执行以下代码:
int main()
{
float f1 = 15.23;
char *ptr = &f1;
printf("%c", *(ptr));
getch();
return 0;
}
编译错误:错误C2440:'初始化':无法转换 'float * __ w64'到'char *'
这有什么具体原因吗?为什么不允许这样做?
答案 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 *,则您期望这样。)