我正在学习一门非常有趣的CE课程和C ++课程。在CE中,我对内存如何工作有了更深入的了解。那么,为什么我们需要在c ++中显式声明指针类型?指针只是一个存储单元(或多个单元),它将地址保存到数据类型;虽然数据类型显然需要不同的内存分配,为什么要指针? AKA,为什么指针类型可以在C ++中推广,如果它们都拥有相同的东西,内存地址?
答案 0 :(得分:7)
因为使用C ++的主要原因之一是类型安全。
如果该语言不知道int*
和MyClass*
之间的区别,那么您可能会意外地将int*
分配给MyClass*
,以及运行时行为您的程序将是未定义的。 C ++的目标是让编译器检测到这样的错误,如果没有不同的指针类型,这是不可能的。
struct MyClass
{
double d;
};
void f(MyClass* ptr)
{
ptr->d = 1.0;
}
int main()
{
int i = 0;
f(&i); // error detected at compile time
}
答案 1 :(得分:2)
C ++中有一种称为“严格别名规则”的东西,它与“类型安全”大致相同。
在以下代码中:
int a = 123456;
void foo(float *p){
*p = 1.0f;
std::cout << a;
}
允许编译器假定p
从不指向a
并进行优化。如果它是void *p
那么假设就会触发。
答案 2 :(得分:0)
当你进行汇编语言编程时,你会发现没有指针类型。
你可以随时使用(void *)做你想要的事情,但这会破坏语言的有用性。
如果你有
class CLASS
{
...
public:
void doSomething ()
...
} ;
....
void *x = new CLASS ;
然后你将无法做到
x->doSomething () ;
因为编译器不会知道&#34; x&#34;的属性是什么是因为C ++使用编译时绑定到函数。
有些运行时绑定的语言允许你这样做。