2012-01-30 81 views
1

好的,所以我已經深入到C++了,因爲我遲到了。指針終於開始有意義,至於何時使用它們,如何正確實現它們等等。C++:指針語法之間的區別

但是,我仍然有一個需要回答的指針的基本用法有一個小問題。我會直接跳到代碼:

下面的類A和功能foo(A* bar) ...

class A 
{} 

void foo(A* bar) 
{} 

...什麼是以下調用foo之間的區別?

A* a; 
A b; 

foo(a); 
foo(&b); 

他們都編譯罰款,據我記得我沒有跟他們任何問題。

我認爲A b;被實例化在那裏,而與new創建A* a;需求(因爲它沒有實際創建的對象,它只是舉行了4字節長的參考電位A對象)。

我可以,如果我正確地思考這個問題,請a = b;編輯做出a = &b),然後順利通過afoo。但是,如果我不做a = &bfoo會嘗試讀取a指向的(不存在的)對象,則會導致運行時錯誤。

此外,如果以上是正確的,那麼假設我可以成功地撥打foo(&b);就好了。

我正確嗎?

謝謝!

回答

5

是的,你的理解是正確的。

foo(&b); 

傳遞A類型的一個已存在的對象的地址作爲參數起作用foo()

foo(a); 

將指針指向類型A作爲函數參數。爲了能夠做任何有意義的事情,它必須指向一個有效的A對象。

堆棧分配對象:
創建類型爲A的堆棧(本地存儲)的對象&使指針a指向這個對象:

A* a; 
A b; 

a = &b; 
它可以通過兩種方式來完成

動態內存分配:

A *a = new A; 

釷ough,一旦你做了動態內存分配,你必須記住使用後明確地釋放alloated內存,否則你將有內存泄漏:

delete a; 

注意,它始終是更好地避免動態分配遠儘可能,如果您必須這樣做,請使用Smart pointers而不是原始指針。

+0

@SethCarnegie:是的。糾正。感謝您指出了這一點。 – 2012-01-30 03:01:06

+0

智能指針的良好鏈接。我從來沒有聽說過他們,但他們似乎非常有用。我得看看他們! – Qix 2012-01-30 03:17:53

+2

@ Di-0xide:你應該。 RAII是C++最強大的功能之一。 – 2012-01-30 03:32:04

0

你基本上是正確的。你不應該假設指針是4個字節(例如,在amd64系統上它可能是8)。另外,您的分配應該是a = &b;(請注意地址運算符的添加)。除此之外,這聽起來很合理。

4

你不能做a = b

它必須是a = &b,設置ab地址。

您對內存管理也是正確的:b分配在堆棧上,而a只爲指針分配空間,併爲您創建實際對象。

foo(&b)將工作文件,其中初始化*a(如通過a = new A())之前的foo(a)的行爲將是不確定的。

+0

哎呀!是的,我錯過了'&'! – Qix 2012-01-30 03:12:47

3

在C++中,指針是第一類對象。指針不僅僅是一個需要關聯對象具有身份的不可見引用。這就是Java/C#引用的工作原理(或者大多數其他語言),但指針本身就是一個對象。

所以A* a聲明一個指針。它沒有指向任何東西,它不指向任何東西。如果/當它指向某件事物時,它不需要自己的那東西。因此你不需要做a = new A()。你也可以做a = &b(讓a包含對象b的地址,或者它也可以指向A類型的任何其他對象,指針只是一個存儲地址的對象。拋棄它「需要創建的對象」的概念

一個對象,它包含一個地址(或它包含特殊值null),並且如果它包含一個地址,該地址可能有也可能不是A類型的對象。