指针存储它指向的变量的地址。但是为什么一种类型的指针不能指向另一种类型的变量的地址呢?
例如,为什么下面的代码会给我一个错误?
int main()
{
int *i;
float a;
i=&a; //this statement gives me an error
}
答案 0 :(得分:0)
您已将i
声明为整数,将a
声明为浮点数。
如果指向一个变量,数据类型应该相同,只有当a是一个整数变量时才可以指向a。
更改as int的数据类型并执行该程序。
您可以参考this链接。
如果它是一个void指针,指针可以指向任何类型。
但无法取消引用void指针。只有当编译器知道指针变量的数据类型时,它才能取消引用指针并执行操作。
答案 1 :(得分:0)
在32位机器中,通常以4个字节为单位。声明数据类型时,它指向该数据类型并将字节等于数据类型字节。
在这种情况下,我是一个指向int的指针。这意味着它将指向四个字节。值可以以整数格式存储。而a是浮点变量。因此它将采用以浮动格式存储的值(它表示指数和尾数)。在访问具有不同数据类型的指针时。它将取消引用相应数据类型格式的值。所以我们得到了一些垃圾值或者在位中启用了一些值。
答案 2 :(得分:-4)
嗯,实际上非常有趣,我正在编写代码并遇到这种错误,当时我自己想出了原因但后来忘记了,一旦我发布了问题,答案就再次发现给我了
在上面的代码中,i
是一个整数类型的指针变量,它被分配了4个字节的内存(虽然取决于平台,但现在让我们假设)另一方面浮动将分配8个字节的内存(再次假设)。因此,如果我使i
指向float变量,它将失去精度,因为它只能包含存储在前两个字节中的值。