一、认识结构体
1.结构体概念
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。
结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。
2.结构体的定义
结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。
struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
//常用两种定义法
struct point { //point为结构名
member-list // member list是标准的变量定义,如int a;float b;
member-list
member-list
...
} v-list ; //v-list 表示变量定义,即定义上述中a,b
//第二种方法
struct point {
member-list
member-list
member-list
...
} v-list ;
//也可用typeof创建新类型
typedef struct
{
int a;
char b;
double c;
} Simple2;
同时,结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。
例
//此结构体的声明包含了其他的结构体
struct C
{
char string[100];
struct SIMPLE a;//其他结构体
};
//此结构体的声明包含了指向自己类型的指针
struct N
{
char string[100];
struct NODE *next;
};
二、结构体的初始化
和其它类型变量一样,对结构体变量也需指定初始值。,具体方法如下
#include<stdio.h>
struct date
{
int month;
int day;
int year;
}
int main()
{
//法1
struct date today={23,11,4};
//法2
struct date today2={.month=10,.year=23,.day=4};
}
注意:数组不能分开插入,如
struct name a;
a.first-name="li"; 这种做法是不可执行的,可以使用strcpy来进行
三、访问结构成员
结构与数组相似,数组用[]和下标访问成员,结构用.和名字访问,如 date.month
#include <stdio.h>
struct Books
{
char title[10];
char author[20];
char subject [30];
};
int main( )
{
struct Books book1={"C语言","abc","computer"};
printf( "Book title : %s\n", book1.title);
return 0;
}
四.结构运算
- 要访问整个结构,直接用结构变量的名字
- 对于整个结构,可以做赋值,取地址,也可以传递给函数参数
- pl=(struct point){5,10};//相当于pl.x=5,pl.y=10;
- p1=p2//相当于p1.x=p2.x,p1.y=p2.y
五.结构作为函数传参
- 整个结构可以作为参数的值传入函数
- 这时候是在函数内新建一个结构变量,并复制调用者的结构的值
- 也可以返回一个结构
#include <stdio.h>
#include <string.h>
struct Books
{
char title[50];
char author[50];
char subject[100];
};
void printBook( struct Books book )
{
printf( "Book title : %s\n", book.title);
printf( "Book author : %s\n", book.author);
printf( "Book subject : %s\n", book.subject);
}
/* 函数声明 */
void printBook( struct Books book );
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Books */
struct Books Book2; /* 声明 Book2,类型为 Books */
/* Book1 详述 */
strcpy( Book1.title, "C Pro");
strcpy( Book1.author, "Nu Ali");
strcpy( Book1.subject, "computer");
/* Book2 详述 */
strcpy( Book2.title, "123");
strcpy( Book2.author, "acxj jhu");
strcpy( Book2.subject, "math");
/* 输出 Book1 信息 */
printBook( Book1 );
/* 输出 Book2 信息 */
printBook( Book2 );
return 0;
}
破译时,结果
Book title : C Pro
Book author : Nu Ali
Book subject : computer
Book title : 123
Book author : acxj jhu
Book subject : math
六.指向结构的指针
- 定义指向结构的指针,方式与定义指向其他类型变量的指针相似
- 访问结构变量中成员时用->
将上列的代码改造
#include <stdio.h>
#include <string.h>
struct Books
{
char title[50];
char author[50];
char subject[100];
};
void printBook( struct Books *book )
{
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
}
/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
struct Books Book1; /* 声明 Book1,类型为 Books */
struct Books Book2; /* 声明 Book2,类型为 Books */
/* Book1 详述 */
strcpy( Book1.title, "C Pro");
strcpy( Book1.author, "Nu Ali");
strcpy( Book1.subject, "computer");
/* Book2 详述 */
strcpy( Book2.title, "123");
strcpy( Book2.author, "acxj jhu");
strcpy( Book2.subject, "math");
/* 输出 Book1 信息 */
printBook( &Book1 );
/* 输出 Book2 信息 */
printBook( &Book2 );
return 0;
}
运行结果
Book title : C Pro
Book author : Nu Ali
Book subject : computer
Book title : 123
Book author : acxj jhu
Book subject : math
七.结构中的结构
1.结构数组
struct date dates[100];
struct date dates[]={{4,5,2005},{2,6,2009}};
//遍历数组
2.嵌套的结构
struct point
{
int x;
int y;
};
struct a
{
struct point pt1;
} ;