我是 C 新手,我想知道这两者之间有什么区别:
char* name;
struct book *abook;
我知道 struct 构造了一本书,但是 char 怎么会*
放在变量名之前?
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.
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++ 现在应该只指向一个字节。
如果要创建结构的多个实例,则需要标记结构的声明。如果声明被标记,则该标记可以稍后在结构实例的定义中使用。例如:
struct book b;
定义了一个变量 pt,它是一个 struct point 类型的结构。
struct book
是你的类型。现在您可以定义指向此类型的指针。
如果您仍然感到困惑,请使用typedef
为此结构定义新类型:
typedef struct book Book;
typedef struct book* BookPtr;
请记住,这BookPtr
只会影响第一个变量。
struct book
并且char
都是类型。struct book* abook
指向 book 类型结构的指针也是如此,该指针被命名为 abook。
char* name
声明是一样的。它是指向 char 类型的指针。
这种定义指针的方式通常用于将文本字符串传递给函数,而不会过多地填充本地堆栈堆。它也比复制整个 char 数组占用更少的 CPU 资源。所以大多数情况下,这个 char 指针将指向数组中的第一个 char(例如char name[30];
:)