在 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
显示错误,表示无法将 char*、float* 等指针分配给 int 变量。好的..,所以编译器知道 我想要一个指针的变量类型。这与普通变量不同,在普通变量中编译器不知道我想要哪种类型。例如:-
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
或任何其他类型的数据不同,即使它们将打印与输出相同的值(如果隐式转换),但在堆栈中,它们并不完全相同"value"。所以编译器在指针的情况下不允许这样做。
使用关键字auto
可以管理您要查找的内容。
在C++中,需要提到指针的类型。例如,
int a = 5;
int * p = &a;
这里,'int *'中的'int'是必须的。我发现的原因是 它需要取消引用。(知道要读取的字节数及其解释)和指针算术。
但是,如果我写:-
int a = 5;
char * p = &a;
float * p2 = &a;
//etc
显示错误,表示无法将 char*、float* 等指针分配给 int 变量。好的..,所以编译器知道 我想要一个指针的变量类型。这与普通变量不同,在普通变量中编译器不知道我想要哪种类型。例如:-
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
或任何其他类型的数据不同,即使它们将打印与输出相同的值(如果隐式转换),但在堆栈中,它们并不完全相同"value"。所以编译器在指针的情况下不允许这样做。
使用关键字auto
可以管理您要查找的内容。