为什么我们需要在c ++中显式声明指针类型?

时间:2018-03-11 10:39:09

标签: c++ memory

我正在学习一门非常有趣的CE课程和C ++课程。在CE中,我对内存如何工作有了更深入的了解。那么,为什么我们需要在c ++中显式声明指针类型?指针只是一个存储单元(或多个单元),它将地址保存到数据类型;虽然数据类型显然需要不同的内存分配,为什么要指针? AKA,为什么指针类型可以在C ++中推广,如果它们都拥有相同的东西,内存地址?

3 个答案:

答案 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 ++使用编译时绑定到函数。

有些运行时绑定的语言允许你这样做。