什么是不同类别的指针?

问题描述:

任何人都可以解释指针的不同类别(如野指针)吗?什么是不同类别的指针?

+1

你能澄清?什么类别?野指针不是一个标准术语。 – Naveen 2010-05-27 07:18:22

+0

野指针是事实上的标准术语,意思是指向某个随机位置的未初始化的指针变量。有关其他类似条款,请询问Google。 – 2010-05-27 07:25:12

+3

从来没有听说过野生指针,我一直在这样做了一段时间。 – 2010-05-27 07:39:02

  • 有效指针:一个指向一个真正的对象在内存
  • 无效指针:一个指向内存不是什么应该是。
  • NULL pointer:一个指针,其值为0,因此不指向任何东西。
  • 悬挂指针(有时也是野指针):一个指向已被删除/释放的内存。
  • 智能指针:根本不是一个指针,而是一个像指针一样工作的对象,但为您管理内存。
+0

尽管NULL常量的计算结果为零,但AFAIK NULL指针的值不需要为零(位模式可能因机器而异)。 – 2010-05-27 07:27:42

+0

我可以将“Dangling”和“Invalid”分类为同一件事。实际上也是空的,但它的验证无效。 – 2010-05-27 07:28:04

+2

但从逻辑上说,它们是不同的。如果你超出界限或者错误地将它分配到了错误的地址,那么指针就是无效的;如果你忘记它已经被释放了,它就会摇晃。 – 2010-05-27 07:32:23

这里是你的答案:

C++ Pointers

...添加正交史蒂夫的答案 -

  • 指针变量(int*char*,也void*这是一个特殊的伪类型必须始终提领前投也。指向指针的指针。)
  • 指向函数的指针(void(*)()int(*)(int))等。)

区别非常重要,因为一个家庭不能投入其他,反之亦然。

也有函数指针指向代码而不是对象。并指向成员,这需要一个类的实例来完全取消引用。指向成员函数的指向代码和要求的指针,以及一个类的实例来完全解引用。

还有几种不同类型的智能指针。这些用于包装动态内存分配,并跟踪底层数据的所有权。当没有人再拥有数据时,动态内存将自动释放。这里的三大重点是范围指针,共享指针和弱指针。作用域指针只有一个所有者,当它们超出作用域时,它们将被删除[参见C++中的std::auto_ptr和C++ 0x中的std::unique_ptr]。共享指针可以有很多所有者,并且直到所有所有者都完成它们之后,内存才会被释放。弱指针是这些形式中的一种,但它们并不总是保持严格的所有权;他们在需要时请求所有权,并且如果相应的共享指针已经用尽所有者,则该请求被拒绝。

+1

指向成员的+1;) – 2010-05-27 07:46:59

+0

指向成员的指针需要*实例*,而不是要取消引用的类。 – 2010-05-27 09:22:52

+0

对不起,对,你是对的。 – 2010-05-27 09:27:36

你也可以根据自己的“不变性”添加分类和排序指针的另一个层面:

指向一个const - 你可以改变指针,但是不知道它指向。

例子:

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

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

常量指针 - 你不能改变什么指针指向。

例子:

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

常量指针到一个const - 你不能改变什么指针指向,你不能改变指针本身。

例子:

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