C++ 指针的不同类别是什么?

C++ 指针的不同类别是什么?,c++,c,C++,C,有谁能解释一下指针的不同类别(如野生指针)?以下是您的答案: 以下是您的答案: 有效的指针:指向内存中真实对象的指针 无效的指针:指向不应该是的内存的指针 NULL指针:其值为0的指针,因此不指向任何内容 悬空指针(有时也指野生指针):指向已删除/释放的内存的指针 Smart指针:实际上根本不是一个指针,而是一个像指针一样的对象,它为您管理内存 有效的指针:指向内存中真实对象的指针 无效的指针:指向不应该是的内存的指针 NULL指针:其值为0的指针,因此不指向任何内容 悬空指针(有时也指野生

有谁能解释一下指针的不同类别(如野生指针)?

以下是您的答案:

以下是您的答案:

  • 有效的指针:指向内存中真实对象的指针
  • 无效的指针:指向不应该是的内存的指针
  • NULL指针:其值为0的指针,因此不指向任何内容
  • 悬空指针(有时也指野生指针):指向已删除/释放的内存的指针
  • Smart指针:实际上根本不是一个指针,而是一个像指针一样的对象,它为您管理内存
      • 有效的指针:指向内存中真实对象的指针
      • 无效的指针:指向不应该是的内存的指针
      • NULL指针:其值为0的指针,因此不指向任何内容
      • 悬空指针(有时也指野生指针):指向已删除/释放的内存的指针
      • Smart指针:实际上根本不是一个指针,而是一个像指针一样的对象,它为您管理内存

      …与史蒂夫的答案正交添加-

      • 指向变量的指针(
        int*
        char*
        ,也是
        void*
        ,这是一种特殊的伪类型,必须在取消引用之前强制转换。也指指向指针的指针。)
      • 指向函数(
        void(*)(
        int(*)(int)
        )等)的指针

      这种区别很重要,因为一个家庭不能与另一个家庭融合,反之亦然。

      …史蒂夫的答案是正交的-

      • 指向变量的指针(
        int*
        char*
        ,也是
        void*
        ,这是一种特殊的伪类型,必须在取消引用之前强制转换。也指指向指针的指针。)
      • 指向函数(
        void(*)(
        int(*)(int)
        )等)的指针

      区别很重要,因为一个族不能转换成另一个族,反之亦然。

      还有函数指针,它指向代码而不是对象。以及指向成员的指针,这些成员需要类的实例才能完全取消引用。和指向成员函数的指针,成员函数指向代码,并要求和类的实例完全取消引用


      还有几种不同类型的智能指针。它们用于封装动态内存分配,并跟踪底层数据的所有权。当不再有人拥有数据时,动态内存会自动释放。这里的三个大指针是作用域指针、共享指针和弱指针。作用域指针只有一个所有者,当它们超出作用域时会被删除[参见C++03中的
      std::auto_ptr
      和C++0x中的
      std::unique_ptr
      )。共享指针可以有多个所有者,在所有所有者都使用完它们之前,内存不会被释放。弱点是其中的一种形式,但它们并非始终保持严格的所有权;它们在需要时请求所有权,如果相应的共享指针的所有者已用完,则该请求将被拒绝。

      还有指向代码而不是对象的函数指针。以及指向成员的指针,这些成员需要类的实例才能完全取消引用。和指向成员函数的指针,成员函数指向代码,并要求和类的实例完全取消引用


      还有几种不同类型的智能指针。它们用于封装动态内存分配,并跟踪底层数据的所有权。当不再有人拥有数据时,动态内存会自动释放。这里的三个大指针是作用域指针、共享指针和弱指针。作用域指针只有一个所有者,当它们超出作用域时会被删除[参见C++03中的
      std::auto_ptr
      和C++0x中的
      std::unique_ptr
      )。共享指针可以有多个所有者,在所有所有者都使用完它们之前,内存不会被释放。弱点是其中的一种形式,但它们并非始终保持严格的所有权;他们在需要时请求所有权,如果相应的共享指针的所有者已用完,则该请求将被拒绝。

      您还可以添加另一级别的分类,并根据指针的“常量”对其进行排序:

      指向常量的指针-您可以更改为指针,但不能更改指针指向的内容

      例如:

      int i = 42;
      const int* pi = &i;
      
      int i = 42;
      int* const pi = &i;
      
      int i = 42;
      const int* const pi = &i;
      

      常量指针-无法更改指针指向的内容

      例如:

      int i = 42;
      const int* pi = &i;
      
      int i = 42;
      int* const pi = &i;
      
      int i = 42;
      const int* const pi = &i;
      
      指向常量的常量指针-您无法更改指针指向的内容,也无法更改指针本身

      例如:

      int i = 42;
      const int* pi = &i;
      
      int i = 42;
      int* const pi = &i;
      
      int i = 42;
      const int* const pi = &i;
      

      您还可以根据指针的“常量”添加另一级别的分类和排序指针:

      指向常量的指针-您可以更改为指针,但不能更改指针指向的内容

      例如:

      int i = 42;
      const int* pi = &i;
      
      int i = 42;
      int* const pi = &i;
      
      int i = 42;
      const int* const pi = &i;
      

      常量指针-无法更改指针指向的内容

      例如:

      int i = 42;
      const int* pi = &i;
      
      int i = 42;
      int* const pi = &i;
      
      int i = 42;
      const int* const pi = &i;
      
      指向常量的常量指针-您无法更改指针指向的内容,也无法更改指针本身

      例如:

      int i = 42;
      const int* pi = &i;
      
      int i = 42;
      int* const pi = &i;
      
      int i = 42;
      const int* const pi = &i;
      

      你能澄清一下吗?什么类别?野生指针不是标准术语。野生指针是事实上的标准术语,表示指向某个随机位置的未初始化指针变量。对于其他类似的术语,请询问谷歌。从未听说过野生指针,我已经做了一段时间。我也是,但维基百科似乎喜欢它。你能澄清一下吗?什么类别?野生指针不是一个标准术语。野生指针是事实上的标准术语,意味着一个未初始化的指针变量指向一些