在C++中,为什么需要提及指针的类型?
In C++, why is mentioning the type of the pointer necessary?
在C++中,提及指针的类型是必要的。例如
int a = 5;
int * p = &a;
在这里,"int *"中的"int"是必要的。我发现的原因是 它需要取消引用。(不知道要读取的字节及其解释(和指针算术。
但是,如果我写:-
int a = 5;
char * p = &a;
float * p2 = &a;
//etc
显示错误,指出无法将字符*,浮点*等指针分配给整数变量。 好的..,所以编译器知道我想要指针的变量类型。这与普通变量不同,在普通变量中,编译器并不确切知道我想要哪种类型。例如:-
int a = 5;
float b = 5;
double c = 5;
long d = 5;
char e = 5;
所有这些都很好。我需要在这里编写类型,因为编译器不知道我想要哪种类型,因为所有这些都可以工作。
但是,在指针的情况下,它知道我要为其声明指针的确切变量类型。
即使我使用显式类型转换,我仍然会以某种方式告诉我需要的指针类型,并且仍然必须指定正确的指针类型。
int a = 5;
char * b = (char*)&a;//This would work.
//However this,
int * b = (char*)&a;
//wouldn't, as even with typecasting, c++ knows exactly the type of pointer we need.
所以,我的问题是,当C++知道我要指向的变量类型时,为什么它不自动设置指针的类型?当它可能在未使用正确类型的指针时出错时,为什么不自动设置它?
如果将b
声明为auto
,编译器将使用类型推断并确定类型本身。但是,如果您使用特定类型,则必须是正确的类型。
一个可能的原因是数据的字节级操作。
例如,你可以有一个 void* 指针(指向一些内部字节数据(,可以通过 *int 或 *char 或你需要的任何指针来访问,具体取决于您希望如何读取或写入数据。
提及类型表明您的内存将如何存储数据,特别是内存案例的数量,每种类型的数据都有自己的大小,例如(见sizeof ()
(,使用低级语言可以解决内存和硬件的关注。
例如,double
的内存表示形式与int
或任何其他类型的数据不同,即使它们将打印与输出相同的值(在隐式转换的情况下(,但在堆栈中,它们并不完全相同的"值"。因此,编译器在指针的情况下不允许这样做。
使用关键字auto
可以管理您要查找的内容。
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?