在C语言开发中,结构体用到的机会很多。所谓结构体,就是定义一种里面包含多种元素的变量。
我们来看一个简单的例子。比如你想定义一个书名列表然后为每本书创建书名和作者作为书的信息。结构体变量定义如下:
struct book {
char name[30];
char author[20];
};
struct book a[2] = { { "Nature","Lina" },{ "Animals","Nick" } };
以上代码定义了一个名为book的结构体,然后a作为带有这个结构体的变量的一个内含两本书的列表(结构体数组)。也可以定义为如下:
struct book {
char name[30];
char author[20];
}a[2] = { {"Nature","Lina" },{ "Animals","Nick" } };
所完成的功能是完全一样的。第二种方法用得更多因为写法更简练。
遍历结构体中成员内容并打印出来,完整代码如下:
#include<stdio.h>
int main() {
struct book {
char name[30];
char author[20];
}a[2] = { {"Nature","Lina" },{ "Animals","Nick" } };
int i;
for (i = 0; i < 2; i++) {
printf("book name: %s author: %s\n", a[i].name, a[i].author);
};
getchar();
return(0);
}
运行后的输出值为:
book name: Nature author: Lina
book name: Animals author: Nick
定义一个指向结构体(book)变量的指针函数p:struct book *p
现在就可以用结构体指针完成上述同样的功能了(结构体定义在main函数外为全局变量,main函数内为局部变量,两种均可):
#include<stdio.h>
struct book {
char name[30];
char author[20];
}a[2] = { {"Nature","Lina" },{ "Animals","Nick" } };
int main() {
struct book*p;
for (p = a; p < a+2; p++) {
printf("book name: %s author: %s\n", p->name, p->author);
};
getchar();
return(0);
}
输出值和之前的程序一样。
以下例子为使用&地址符号给结构体指针赋值:
#include<stdio.h>
struct book {
char name[30];
char author[20];
};
int main() {
struct book*p;
struct book a[2] = { { "Nature","Lina" },{ "Animals","Nick" } };
p = &a[0];
printf("book name: %s author: %s\n", p->name, p->author);
getchar();
return(0);
}
输出结果为存入的a[0]的信息:
book name: Nature author: Lina
另外在许多大型软件的开发中,经常会定义结构体变量为宏变量以简化结构体的引用。例如:typedef struct book{...}BOOK, 引用的时候就直接定义BOOK a。简而言之,就是把struct book替换为BOOK。
#include<stdio.h>
typedef struct book {
char name[30];
char author[20];
}BOOK;
int main() {
BOOK*p;
BOOK a[2] = { { "Nature","Lina" },{ "Animals","Nick" } };
p = &a[0];
printf("book name: %s author: %s\n", p->name, p->author);
getchar();
return(0);
}
运行效果是一样的。