2012-09-23 57 views
1

指針我是新的C和我不知道有什麼區別這兩者之間:差異在C

char* name; 
struct book *abook; 

我所知道的結構構造了一本書,但隨着焦炭怎麼來的*放在變量名之前?

+1

可能重複的[在C中,爲什麼星號在變量名之前,而不是類型之後?](http://stackoverflow.com/questions/398395/in-c-why-is-the-asterisk -before最變量名 - 而高於後 - 型) –

回答

7

TYPE * variableName,TYPE * variableName和TYPE * variableName在語法上都是相同的。這是你如何使用它們的記號問題。

我個人更喜歡最後的形式。這僅僅是因爲星號運算符在右邊的令牌上工作。在像

TYPE* foo, bar; 

只有foo是一個指針,但不是酒吧。因此,將星號放在變量名旁邊看起來更符合邏輯。

0

struct bookchar都是這兩種類型。 因此,struct book* abook是指向名爲abook的指針的類型簿結構的指針。

char* name聲明是一樣的。它是一個指向char類型的指針。

這種定義指針的方式通常用於將文本字符串傳遞給函數,而不用填充本地堆棧堆。與複製整個字符數組相比,它的CPU佔用也更少。所以大多數這個字符指針將指向數組中的第一個字符(例如:char name[30];

0

如果要創建一個結構的多個實例,則需要標記該結構的聲明。如果聲明被標記,那麼稍後可以在結構實例的定義中使用該標記。例如:

struct book b; 

定義一個變量PT其是類型結構點的結構。
struct book是你的類型。現在你可以定義指向這種類型的指針。

如果仍是混淆了你,使用typedef定義一個新的類型,這樣的結構:

typedef struct book Book; 
typedef struct book* BookPtr; 

請記住,BookPtr只會影響第一個變量。

1

C編譯器將忽略符號之間的空格這樣:

char* name; 

相同

char *name; 
char * name; 
char*name; 

struct book *abook; 

相同

struct book* abook; 
struct book * abook; 
struct book*abook; 

星號可能位於變量名旁邊,因爲它只適用於它前面的變量,而不是類型。所以,如果你這樣做:

int* a1, b1; 

你A1定義爲int指針和B1爲int,所以這是一個更清晰一點:

int *a1, b1; 

至於到指針之間的內在差別char和指向結構體的指針,它們都是8個字節(在64位系統上 - 在32位系統上是4個字節)。即,

sizeof(char *)與sizeof(struct book *)相同。

但是,編譯器會保留有關每個指向的信息,以便知道如何處理諸如增加一個(a ++)或取消引用一個(* b)時的情況。也就是說,除了第一個地址被存儲在指針變量中之外,它需要知道涉及多少個字節。

如果a1指向一個int,則a1 ++現在應該進一步指向四個字節(a1中的地址整數值應該高4)。雖然如果a1指向一個char,那麼a1 ++現在應該只指向一個字節。