1

我是 C 新手,我想知道这两者之间有什么区别:

char* name; 
struct book *abook;

我知道 struct 构造了一本书,但是 char 怎么会*放在变量名之前?

4

4 回答 4

7

TYPE * variableName, TYPE* variableName and TYPE *variableName are all syntactically the same. It's a matter of notation how you use them.

Personally I prefer the last form. It's simply because the star operator works on the token to the right of it. In a declaration like

TYPE* foo, bar; 

only foo is a pointer but not bar. Therefore it looks more logical to put the star right next to the variable name.

于 2012-09-23T18:16:04.027 回答
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 的指针和指向 struct book 的指针之间的内部差异,它们都是 8 个字节(在 64 位系统上 - 在 32 位系统上为 4 个字节)。那是,

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

但是编译器保留了每个指向的信息,因此它知道如何处理诸如当您递增一(a++)或取消引用一(*b)时的事情。也就是说,除了指针变量中存储的第一个地址之外,它还需要知道涉及多少字节。

如果 a1 指向一个 int,a1++ 现在应该再指向四个字节(a1 中的地址整数值应该高 4)。如果 a1 指向一个字符,a1++ 现在应该只指向一个字节。

于 2012-09-23T19:25:16.017 回答
0

如果要创建结构的多个实例,则需要标记结构的声明。如果声明被标记,则该标记可以稍后在结构实例的定义中使用。例如:

struct book b;

定义了一个变量 pt,它是一个 struct point 类型的结构。
struct book是你的类型。现在您可以定义指向此类型的指针。

如果您仍然感到困惑,请使用typedef为此结构定义新类型:

typedef struct book Book;
typedef struct book* BookPtr;

请记住,这BookPtr只会影响第一个变量。

于 2012-09-23T18:26:46.917 回答
0

struct book并且char都是类型。struct book* abook指向 book 类型结构的指针也是如此,该指针被命名为 abook。

char* name声明是一样的。它是指向 char 类型的指针。

这种定义指针的方式通常用于将文本字符串传递给函数,而不会过多地填充本地堆栈堆。它也比复制整个 char 数组占用更少的 CPU 资源。所以大多数情况下,这个 char 指针将指向数组中的第一个 char(例如char name[30];:)

于 2012-09-23T18:21:14.737 回答