指向其他类型的指针
Pointer pointing to a different type
指针存储它指向的变量的地址。但是,为什么一种类型的指针不能指向另一种类型的变量的地址呢?
例如,为什么下面的代码给我一个错误?
int main()
{
int *i;
float a;
i=&a; //this statement gives me an error
}
在 32 位机器中,通常以四个字节寻址。声明数据类型时,它指向该数据类型,并将字节等于数据类型字节。
在本例中,我是指向 int 的指针。这意味着它将指向四个字节。值可以以整数格式存储。而 a 是浮点变量。所以它将采用以浮动格式存储的值(它表示指数和尾数(。使用不同的数据类型访问指针时。它将取消引用值对应的数据类型格式。 因此,我们得到了一些垃圾值或在位中启用的一些值。
您已将i
声明为整数,a
声明为浮点数。如果指向变量,则数据类型应相同,仅当 a 是整数变量时,才能指向 a。将 a 的数据类型更改为 int 并执行程序。您可以参考此链接。指针可以指向任何类型(如果它是空指针(。但无法取消引用 void 指针。仅当编译器知道指针变量的数据类型时,它才能取消引用指针并执行操作。
嗯,这实际上很有趣,我正在编写代码并遇到这种错误,当时我自己想出了原因,但后来忘记了,一旦我发布问题,答案就会再次出现在我身边。
在上面的代码中,i
是一个整数类型的指针变量,它被分配了 4 个字节的内存(虽然取决于平台,但现在让我们假设(另一方面,float 将被分配 8 个字节的内存(再次只是假设(。因此,如果我i
指向浮点变量,它将失去精度,因为它只能包含存储在前两个字节中的值。
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?