2010-05-27 56 views
1

任何人都可以解釋指針的不同類別(如野指針)嗎?什麼是不同類別的指針?

+1

你能澄清?什麼類別?野指針不是一個標準術語。 – Naveen 2010-05-27 07:18:22

+0

野指針是事實上的標準術語,意思是指向某個隨機位置的未初始化的指針變量。有關其他類似條款,請詢問Google。 – 2010-05-27 07:25:12

+3

從來沒有聽說過野生指針,我一直在這樣做了一段時間。 – 2010-05-27 07:39:02

回答

9
  • 有效指針:一個指向一個真正的對象在內存
  • 無效指針:一個指向內存不是什麼應該是。
  • 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

5

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

  • 指針變量(int*char*,也void*這是一個特殊的僞類型必須始終提領前投也。指向指針的指針。)
  • 指向函數的指針(void(*)()int(*)(int))等。)

區別非常重要,因爲一個家庭不能投入其他,反之亦然。

6

也有函數指針指向代碼而不是對象。並指向成員,這需要一個類的實例來完全取消引用。指向成員函數的指向代碼和要求的指針,以及一個類的實例來完全解引用。

還有幾種不同類型的智能指針。這些用於包裝動態內存分配,並跟蹤底層數據的所有權。當沒有人再擁有數據時,動態內存將自動釋放。這裏的三大重點是範圍指針,共享指針和弱指針。作用域指針只有一個所有者,當它們超出作用域時,它們將被刪除[參見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

2

你也可以根據自己的「不變性」添加分類和排序指針的另一個層面:

指向一個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;