2012-09-23 56 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 ++现在应该只指向一个字节。