2012-07-17 66 views
0

Possible Duplicate:
In C, why is the asterisk before the variable name, rather than after the type?
Declaring pointers; asterisk on the left or right of the space between the type and name?請告訴我無效*和void *的之間的區別

我一直在使用指針了一會兒,用來聲明指針像

int *x; 

但我們注意到,將向您介紹一些代碼,則*似乎在某些情況下的數據類型,如

void* setValue(){ 
/*   */ 
} 

後有什麼區別,爲什麼它的使用一樣,

+5

這是一種風格的東西.... – Nim 2012-07-17 10:23:21

+3

只需注意:編譯器將輸入流分解爲標記,然後處理這些標記。白色空間不是任何令牌的一部分(儘管它可以用來分隔令牌),所以解析器在這兩種情況下看到的令牌序列是'int','*','x',';'。無論它是寫入int * x;','int * x;','int * x;'還是int * x;(甚至是'int/* obfuscating */*/* comment */x ;'---評論算作白色空間)。 – 2012-07-17 10:32:17

+0

根本沒有區別。無論是使用。 – 2012-07-17 12:11:21

回答

12

語義上什麼都沒有。它是風格。

爲把星旁邊的變量是防止這種常見的錯誤的優點:

char* str1, str2; 
/* str2 is a char, not char* ! */ 

char *str1, *str2; 
/* ok */ 

這個問題是不存在的,返回類型,所以它的問題就更少了那裏。

0

指向void的指針,記爲void*是一個通用的不透明指針。你可以傳遞它(作爲參數,結果,通過變量,領域......)並進行比較,但獲得指向數據的唯一方法是適當地轉換它。不恰當的轉換是未定義的行爲,並可能導致程序崩潰。

至於*之前或之後的空格表示類型中的指針,它是一種風格的東西。除了令牌分隔符(並且*本身是一個令牌),空格並不是真正重要的。

我強烈建議與間距保持一致。你可以使用像例如indent縮進您的源代碼(並將-T選項傳遞給它,以幫助縮進類型名稱)。 GNU indent工具正在對空間進行規範化,並且有許多選項可以調整其行爲(可以將它們放在.indent.pro文件中)。對於C++代碼,請考慮使用astyle而不是indent

+0

您可能想要再次閱讀該問題。 – orlp 2012-07-17 10:27:36

1

無語義差異。

通常建議保持*旁邊的類型,因爲真正的類型的xvoid *。但是,這在語法上是錯誤的,因爲C/C++將星號綁定到變量名。

int *x, y; // declare one pointer to int x and one int y 

我個人儘量保持*中間

int * x; 
2

沒有什麼區別,在某些情況下,它能夠更好地保持它的權利:

int* p1,p2; 

看起來像P1和p2 ara指針,而只有p1是,而

int *p1,p2; 

現在看起來好一點,但良好的作風是分裂它來分隔行:

int *p1; 
int p2; 
2

這是完全一樣a+ba + b之間的區別 - 也就是說,沒有什麼區別。除了需要分離令牌時,Whitespace根本沒有意義。

+0

最後的說法是不正確的,yay trigraphs。 – orlp 2012-07-17 10:31:02

相關問題