2012-05-03 86 views
2

我遇到了一些我不太明白的C代碼。以下編譯和運行很好。 1)爲什麼我可以將char *轉換爲結構體* 2)使用這個成語而不是void *有什麼好處?char * ptr結構

struct foo 
{ 
    int a; 
    int b; 
    char *nextPtr; 
}; 

. . . 

// This seems wrong 
char *charPtr = NULL; 

// Why not 
//void *structPtr = NULL; 

struct foo *fooPtr; 
fooPtr = (struct foo*)charPtr; 

//編輯刪除字符串部分,因爲這不是問題的重點。

+0

什麼是'string'?這是C還是C++? – dirkgently

+2

你可以使用C風格轉換語法將任何東西轉換爲任何東西。編譯器只是相信你。在'void *'的發明之前有一段時間用'char *'來代替,但那段時間早已過去。 – Flexo

+1

對不起,C++如果這是相關的。 – LeviX

回答

1
  1. 您可以在指針類型之間進行轉換,因爲這是語言爲您提供的靈活性。但是,您應該謹慎行事,並且知道您正在做什麼或者可能出現問題。

  2. 否。使用屬性指針類型有一個優點,因此不需要轉換。如果這是不可能的,那麼使用void *並不重要,儘管開發人員讀取代碼可能會更清楚一些。

+1

使用char *意味着用於調試目的,以'printf(「* fooPtr包含%s \ n」,charPtr)的形式在一個句子中打印結構的元素' –

+1

@AhmedJolani:這看起來像一個可怕的設計。結構可以包含轉換爲不可打印字符的數據,並且可能會或可能不會正確終止。 –

+0

根據他的情況no,兩個整數將永遠不會有NULL值\ x00,如果* nextPtr爲NULL,那麼printf將完美地描述這些值,並且一個整數總是有一個可打印的字符(數字)。 –

0

我覺得你對面C.

在現實中的那些經典的「雙刃劍」的一個未來,一個指針指向 - 只是持有地址的變量。理論上,你可以試圖強制指針指向任何東西;一個結構,一個int,一個(填空)。當你試圖將一個指針指向某個指針時,C不會抱怨;它表示你知道你在做什麼。天堂可以幫助你,如果你沒有:)

在現實中,是的,一個void *可能是一個更適合的方式來聲明一個指向任何東西旁邊的指針,但我不確定它有多大的區別正在運行。不會發誓,因爲可能會有編譯器優化,並可能發生,如果指針是強類型的...

1

1)如上所述,您可以強制轉換爲C中的任何指針類型(C++可能有更復雜的規則,其中有我不知道的細節)...

2)的char* VS void*的好處是,你可以在char*但不能在void*執行指針運算。

執行指針算術的智慧可能基於您發佈的代碼而存在疑問,但它常常適用於具有可變長度「數據」的結構。