2013-06-12 74 views
0

在C,如果我有兩個類型的指針:當需要顯式指針類型轉換?

INT以下,是沒有必要把一個明確的轉換(typeA *)

1 p= q  is fine, no need to use p = (typeA *)q; 

2 define: void func(typeA *p){} 

    call: func(q); is fine, no need to use func((typeA *)q) 

3 p=malloc(sizeof(typeA)); is fine, no need to use p=(typeA *)malloc(sizeof(typeA)) 

之外,是C++相同或不?

謝謝!

+0

C++的繼承使一些事情可以允許,可能不在c。但是要注意的一點是,c和C++之間的差異是這個......對於變量'typeA * a; typeB * b; void * v''a = b'的結果可能不同於'v = b; a = v'。這發生在C++中的多繼承。基本上'void *'消除了C++正確跟蹤繼承的能力。 –

+1

你可以看看這個[GOTW關於強制轉換](http://www.gotw.ca/gotw/017.htm) – loic

+1

[我投了malloc的結果嗎?](http://stackoverflow.com/questions/ 605845/do-i-cast-result-of-malloc/605858#605858) –

回答

5

我假設他們是不相關的類型。如果它們都是同一類型的別名,那麼可以將指向一個的指針隱式轉換爲指向另一個的指針。

  1. 不;在這兩種語言中,你都需要一個強制類型來轉換不相關的指針類型。在C++中,如果typeAtypeB的基類,那很好。

  2. 與第一個完全相同 - 都嘗試從typeB*初始化typeA*

  3. Fine in C; void*可以隱式轉換爲任何對象指針類型。這種轉換在C++中是不允許的;但你通常不應該使用malloc

0

對於前兩種情況你需要強制類型轉換(在c和C++中都是這樣),因爲它們不是void類型,所以需要明確強制轉換它們。

對於第三種情況,malloc返回void指針,它將根據cast進行自我更改。因此不需要在此處顯式類型轉換(在c中)。

4

如果您使用TypeB *其中TypeA *是預期的,那麼您總是需要演員。在C中,有兩個例外:如果另一個類型是數據指針類型,則從和到void *的轉換是隱式的(不需要強制轉換)。只有在POSIX下,void *也與函數指針類型隱式兼容。

在C++中,但是,只有轉換void *是隱式的,所以分配T *p = <expression of type void *>;仍然需要鑄造。

另一個區別在於,在C++中,如果TypeATypeB是類(或結構)的類型,以及從TypeA然後從TypeB *TypeA *轉換TypeB繼承(「向下轉換」)是再次隱式的(無所需鑄造)。當然,這不會倒退(「上傳」)。

總而言之,你不投的malloc()的返回值,這是因爲:

  • 在C不是必需的;

  • 在C++中它將是必需的,但在C++中,您無論如何都不使用malloc()

+0

「總而言之,你不會投出malloc()的返回值,因爲: 不需要C; 在C++中它是必需的,但在C++中,您不要使用malloc()。「最好的報價,我聽過。 – dhein