C 数组允许定义可存储相同类型数据项的变量,结构 是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:
Title
Author
Subject
Book ID
为了定义结构,您必须使用 struct 语句。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 个。以下为实例:
struct
{
int a ;
char b ;
double c ;
} s1 ;
struct SIMPLE
{
int a ;
char b ;
double c ;
} ;
struct SIMPLE t1 , t2 [ 20 ] , * t3 ;
typedef struct
{
int a ;
char b ;
double c ;
} 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 ;
struct A
{
struct B * partner ;
} ;
struct B
{
struct A * partner ;
} ;
结构体变量的初始化
和其它类型变量一样,对结构体变量可以在定义时指定初始值。
实例
#include < stdio.h >
struct Books
{
char title [ 50 ] ;
char author [ 50 ] ;
char subject [ 100 ] ;
int book_id ;
} book = { " C 语言 " , " CODERCTO " , " 编程语言 " , 123456 } ;
int main ( )
{
printf ( " title : %s \ nauthor: %s \ nsubject: %s \ nbook_id: %d \ n " , book . title , book . author , book . subject , book . book_id ) ;
}
执行输出结果为:
title : C 语言
author: CODERCTO
subject: 编程语言
book_id: 123456
为了访问结构的成员,我们使用成员访问运算符(.) 。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用 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 ;
struct Books Book2 ;
strcpy ( Book1 . title , " C Programming " ) ;
strcpy ( Book1 . author , " Nuha Ali " ) ;
strcpy ( Book1 . subject , " C Programming Tutorial " ) ;
Book1 . book_id = 6495407 ;
strcpy ( Book2 . title , " Telecom Billing " ) ;
strcpy ( Book2 . author , " Zara Ali " ) ;
strcpy ( Book2 . subject , " Telecom Billing Tutorial " ) ;
Book2 . book_id = 6495700 ;
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 ) ;
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 ;
}
当上面的代码被编译和执行时,它会产生下列结果:
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
您可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。您可以使用上面实例中的方式来访问结构变量:
实例
#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 ;
struct Books Book2 ;
strcpy ( Book1 . title , " C Programming " ) ;
strcpy ( Book1 . author , " Nuha Ali " ) ;
strcpy ( Book1 . subject , " C Programming Tutorial " ) ;
Book1 . book_id = 6495407 ;
strcpy ( Book2 . title , " Telecom Billing " ) ;
strcpy ( Book2 . author , " Zara Ali " ) ;
strcpy ( Book2 . subject , " Telecom Billing Tutorial " ) ;
Book2 . book_id = 6495700 ;
printBook ( Book1 ) ;
printBook ( Book2 ) ;
return 0 ;
}
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 ) ;
printf ( " Book book_id : %d \ n " , 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
您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
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 ;
struct Books Book2 ;
strcpy ( Book1 . title , " C Programming " ) ;
strcpy ( Book1 . author , " Nuha Ali " ) ;
strcpy ( Book1 . subject , " C Programming Tutorial " ) ;
Book1 . book_id = 6495407 ;
strcpy ( Book2 . title , " Telecom Billing " ) ;
strcpy ( Book2 . author , " Zara Ali " ) ;
strcpy ( Book2 . subject , " Telecom Billing Tutorial " ) ;
Book2 . book_id = 6495700 ;
printBook ( & Book1 ) ;
printBook ( & Book2 ) ;
return 0 ;
}
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 ) ;
printf ( " Book book_id : %d \ n " , 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
猜你喜欢: