2012-06-18 39 views
2

我發現這行代碼中的一些代碼,我分析:在指針下用括號

Mintau = (double*) malloc(FadeAll.num_paths*sizeof(double)); 

我也發現了這裏的一個問題(這是它出現其他問題重複),說明不同指針的語法包括:

int *ptr; 
int * ptr; 
int* ptr; 

我應該解釋一下,我完全理解以上三種說法都是一樣的。最後一個是最接近我的代碼行的那個。我想知道的是爲什麼在這種情況下double必須放在括號內?我很抱歉,如果這是一個重複的問題,但我找不到任何有關這一點。

+4

這些都是相同的語法。空白不重要。 – EJP

+1

我不太瞭解downvoting,但是有人能夠解釋爲什麼post是downvoted?我看到downvote的描述是「這個問題沒有顯示任何研究工作,它不清楚,或者沒有用處。」然而,我正在尋找我的問題的答案,找不到一個。我說我做了研究,並認爲我非常清楚我在找什麼。答案對我理解我正在使用的代碼非常有用。我錯過了什麼? – TZPike05

回答

5

有此三個聲明沒有區別:

int *ptr; 
int * ptr; 
int* ptr; 

(double*)必須是在括號中,因爲它是一個演員。

閱讀一些關於鑄造在這個link

希望它能幫助。

+1

感謝鏈接cacho – TZPike05

+0

+1的維基百科鏈接! :D隨時@ TZPike05,你可以作出我的迴應 - 或任何其他 - 作爲對你的問題*的迴應*如果你有另一個問題,更具體的關於C只是拋出另一個問題! –

+0

我相信你的問題是100%有效的,downvoted的人應該解釋他們爲什麼在評論中做到了這一點... –

4

表示演員。函數malloc返回void*(double*)轉換爲價值類型double*

在C中,由於任何指針類型都與void*分配兼容,因此這種強制轉換是無用的。但如果這是C++,那麼就需要投射。

有什麼區別:

int *ptr; 
int * ptr; 
int* ptr; 
+0

謝謝大衛。在查看演員表後,現在變得非常有意義。還是一個C新手,哈哈。 – TZPike05

1

它在括號中,因爲它是一個cast,它基本上告訴編譯器,嘿,你在那裏,把這段內存當作這種類型,因爲我這樣說(順便說一下,這是C語言錯誤的主要原因,除此之外內存分配/重新分配對不匹配)。

在C中,由於void *的投射是自動的,所以在投射malloc的結果時也被認爲是不好的形式。這只是增加代碼噪聲,沒有任何好處。

至於三種變量聲明,請記住int* a, b;與有很大不同。我更喜歡後者,因爲它顯式地顯示了指向變量名的指針綁定,而不是類型。

2

這意味着它是從malloc()的返回類型(void *)到float *的演員表。什麼是演員? http://en.wikipedia.org/wiki/Type_conversion#Explicit_type_conversion

順便說一句,鑄造返回值爲malloc()的做法是非常糟糕的做法。請看原因:Do I cast the result of malloc?

+0

謝謝你的鏈接。這是一個很好的閱讀 – TZPike05

+0

沒問題。很高興我能幫上忙。 – 2012-06-18 14:40:38

+1

正如一個方面:如果決定將代碼遷移到C++,依靠在C中隱式投射'void *'會導致問題。 –

2

(double*);每當你看到的形式(類型名稱)表達的表達,它的意思是「解釋表達的結果作爲型類型名稱值」。在這種情況下,它說「將malloc的結果解釋爲指向double的指針」。

通常,一種類型的指針值(如char *)不能直接分配給不同類型的指針變量(如double *),因此您必須使用轉換表達式將源值顯式轉換爲目標類型。在1989年標準之前,malloc,callocrealloc都返回了char *值,所以您必須使用轉換將結果分配給不同的指針類型。

void *類型已在1989年的標準作爲一種通用的指針類型可以被分配到不同的指針類型,而不需要鑄造引入,並且所述*alloc功能進行了更改,以返回類型的值。明確地施放malloc的結果現在被認爲是不好的做法。

轉換表達式中類型的結構與聲明中類型的結構非常匹配,只是沒有聲明的東西的名稱。這可能最好用一些例子來解釋。

int *p聲明p作爲指向int的指針;要將表達式的結果投射到指向int的指針,請編寫(int *)。這與聲明相同,減去標識p

下面是幾個例子:

 
Declaration    Cast     Type 
-----------    ----     ---- 
int (*ap)[10]   (int (*)[10])  Pointer to 10-element array of int 
int (*f)(void)   (int (*)(void))  Pointer to function returning int 
char **p    (char **)   Pointer to pointer to char 

如此反覆,轉換表達式的結構是一樣的宣言結構,減去被宣佈的東西的名字。