数组允许定义可存储相同类型数据项的变量,结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项.结构用于表示一条记录,假设你想要跟踪图书馆中书本的动态,可能需要跟踪每本书的下列属性:
为了定义结构,必须使用struct
语句.struct
语句定义了一个包含多个成员的新的数据类型
struct tag{
member-list
member-list
member-list
...
}variable-list;
tag
是结构体标签
member-list
是标准的变量定义,比如int i; 或者float f;或者其他有效的变量定义
variable-list
结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或者多个结构变量
下面是声明Book结构的方式:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
在一般情况下,tag member-list 和variable-list这3部分至少要出现2个
实例:
//此声明声明了拥有3个成员的结构体,分别是整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
int a;
char b;
double c;
}s1;
//此声明声明了拥有3个成员的结构体,分别是整型的a,字符型的b 和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{
int a;
char b;
double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1,t2,t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef struct
{
int a;
char b;
double c;
}Simple2;
//现在可以使用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
在上面的声明中,第一个和第二声明被编译器当做两个完全不同的类型,即使它们的成员列表是一样的,如果令t3=&s1
.则是非法的.
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等.
//此结构体的声明包含了其他的结构体
struct COMPLEX
{
char string[100];
struct SIMPLE a;
};
//此结构体的声明包含了指向自己类型的指针
struct NODE
{
char string[100];
struct NODE *next_node;
}
如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明
struct B; //对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A
{
struct B *partner;
//other members;
};
struct B
{
struct A *partner;
//other members;
}
和其它类型变量一样,对结构体变量可以在定义时候指定初始值
实例:
#include
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}book={"C 语言", "RUNOOB", "编程语言", 123456};
int main()
{
printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
}
为了访问结构的成员,我们使用成员访问运算符(.) 成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号.可以使用struct
关键字来定义结构类型的变量,下面的实例就演示了结构的用法:
实例:
#include
#include
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main()
{
struct Books Book1; //声明Book1,类型是Books
struct Books Book2; //声明Book2,类型是Books
//Book1详述
strcpy(Book1.title, "C programming");
strcpy(Book1.author, "Nuha Ali");
strcpy(Book1.subject, "C programming tutorial");
Book1.book_id =695407;
/* Book2 详述 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* 输出 Book1 信息 */
printf( "Book 1 title : %s\n", Book1.title);
printf( "Book 1 author : %s\n", Book1.author);
printf( "Book 1 subject : %s\n", Book1.subject);
printf( "Book 1 book_id : %d\n", Book1.book_id);
/* 输出 Book2 信息 */
printf( "Book 2 title : %s\n", Book2.title);
printf( "Book 2 author : %s\n", Book2.author);
printf( "Book 2 subject : %s\n", Book2.subject);
printf( "Book 2 book_id : %d\n", Book2.book_id);
return 0;
}