结构体写法形式有点像枚举,本身意义更像数组,但可以是一组不同类型的数据。
1,用结构体表示一本书的数据:
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book;
结构体的形式:
struct tag { member-list member-list member-list ... } variable-list ;
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为实例:
1,//这个结构体并没有标明其标签 struct { int a; char b; double c; } s1; 2,//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c //结构体的标签被命名为SIMPLE,没有声明变量 struct SIMPLE { int a; char b; double c; }; //用SIMPLE标签的结构体,另外声明了变量t1、t2、t3 struct SIMPLE t1, t2[20], *t3; 3,//也可以用typedef创建新类型 typedef struct { int a; char b; double c; } Simple2; //现在可以用Simple2作为类型声明新的结构体变量 Simple2 u1, u2[20], *u3;
1,和2的声明会被编译器当作两个完全不同的类型,如果令 t3=&s1,则是非法的。
个人理解就像java中类的成员一样,如果类名称不一,依然是两个不同类。
2,结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针
//此结构体的声明包含了其他的结构体 struct COMPLEX { char string[100]; struct SIMPLE a; }; //此结构体的声明包含了指向自己类型的指针 struct NODE { char string[100]; struct NODE *next_node; };
3,如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明
这样好理解,要用之前至少大概类型占位符占个坑吧
struct B; //对结构体B进行不完整声明 //结构体A中包含指向结构体B的指针 struct A { struct B *partner; //other members; }; //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明 struct B { struct A *partner; //other members; };
4,定义时指定初始值
#include <stdio.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book = {"C 语言", "RUNOOB", "编程语言", 123456}; int main() { printf("title : %s author: %s subject: %s book_id: %d ", book.title, book.author, book.subject, book.book_id); }
执行:
title : C 语言
author: RUNOOB
subject: 编程语言
book_id: 123456
5,访问结构成员
使用成员访问运算符点(.),使用 struct 关键字来定义结构类型的变量
#include <stdio.h> #include <string.h> 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 = 6495407; /* 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 ", Book1.title); printf( "Book 1 author : %s ", Book1.author); printf( "Book 1 subject : %s ", Book1.subject); printf( "Book 1 book_id : %d ", Book1.book_id); /* 输出 Book2 信息 */ printf( "Book 2 title : %s ", Book2.title); printf( "Book 2 author : %s ", Book2.author); printf( "Book 2 subject : %s ", Book2.subject); printf( "Book 2 book_id : %d ", Book2.book_id); return 0; } 输出: Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
6,结构作为函数参数
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; /* 函数声明 */ void printBook( struct Books book ); 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 = 6495407; /* Book2 详述 */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* 输出 Book1 信息 */ printBook( Book1 ); /* 输出 Book2 信息 */ printBook( Book2 ); return 0; } void printBook( struct Books book ) { printf( "Book title : %s ", book.title); printf( "Book author : %s ", book.author); printf( "Book subject : %s ", book.subject); printf( "Book book_id : %d ", book.book_id); }
当上面的代码被编译和执行时,它会产生下列结果: Book title : C Programming Book author : Nuha Ali Book subject : C Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700
7,指向结构的指针
struct Books *struct_pointer;
通过&获取地址
struct_pointer = &Book1;
如果是采用指针,使用 -> 运算符得到成员
struct_pointer->title;
例子:
#include <stdio.h> #include <string.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }; /* 函数声明 */ void printBook( struct Books *book ); 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 = 6495407; /* Book2 详述 */ strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Zara Ali"); strcpy( Book2.subject, "Telecom Billing Tutorial"); Book2.book_id = 6495700; /* 通过传 Book1 的地址来输出 Book1 信息 */ printBook( &Book1 ); /* 通过传 Book2 的地址来输出 Book2 信息 */ printBook( &Book2 ); return 0; } void printBook( struct Books *book ) { printf( "Book title : %s ", book->title); printf( "Book author : %s ", book->author); printf( "Book subject : %s ", book->subject); printf( "Book book_id : %d ", book->book_id); } 当上面的代码被编译和执行时,它会产生下列结果: Book title : C Programming Book author : Nuha Ali Book subject : C Programming Tutorial Book book_id : 6495407 Book title : Telecom Billing Book author : Zara Ali Book subject : Telecom Billing Tutorial Book book_id : 6495700