在 C 语言的编程世界里,数据结构的合理运用对程序的质量起着决定性作用。数组作为一种基础数据结构,允许我们存储相同类型的数据项。而结构体作为 C 语言中用户自定义的数据类型,极大地拓展了数据表示的灵活性,它允许在一个数据单元中存储不同类型的数据项。无论是开发操作系统、嵌入式软件,还是设计复杂的算法,结构体都发挥着不可或缺的作用。
结构体定义由struct
关键字和结构体名组成,开发者可按需自定义结构体名。其基本语法如下:
struct tag {
member-list
} variable-list ;
其中,tag
为结构体标签,member-list
是标准变量定义,variable-list
为结构变量。以跟踪图书馆书籍信息为例,可声明如下结构体:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
此外,定义结构体时,tag
、member-list
、variable-list
这三部分至少出现两个,存在多种声明形式:
struct
{
int a;
char b;
double c;
} s1;
struct SIMPLE
{
int a;
char b;
double c;
};
struct SIMPLE t1, t2[20], *t3;
typedef
:借助typedef
为结构体创建新类型名,简化变量声明。typedef struct
{
int a;
char b;
double c;
} Simple2;
Simple2 u1, u2[20], *u3;
值得注意的是,即便两个结构体成员列表相同,若标签不同,编译器也会将其视为不同类型。
结构体成员不仅可以是基本数据类型,如int
、float
、char
等,还能包含其他结构体类型或指向自身结构体类型的指针。这一特性为构建复杂数据结构奠定了基础,例如链表和树。
// 包含其他结构体的结构体
struct COMPLEX
{
char string[100];
struct SIMPLE a;
};
// 包含指向自身类型指针的结构体
struct NODE
{
char string[100];
struct NODE *next_node;
};
当两个结构体相互包含时,需对其中一个结构体进行不完整声明:
struct B; // 对结构体B进行不完整声明
struct A
{
struct B *partner;
};
struct B
{
struct A *partner;
};
与其他类型变量一样,结构体变量在定义时可指定初始值。例如:
#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);
}
通过成员访问运算符.
,可访问结构体的成员。下面的示例展示了结构体的基本用法:
#include
#include
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;
}
结构体可作为函数参数,传参方式与其他类型变量或指针类似。通过这种方式,能实现对结构体数据的统一处理:
#include
#include
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);
}
定义指向结构体的指针,可高效访问结构体成员。借助->
运算符,能便捷地访问结构体指针所指向的成员:
#include
#include
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);
}
使用sizeof
运算符可计算结构体的大小。需注意,结构体的实际大小可能受编译器优化和对齐规则的影响,编译器会插入填充字节以提升内存访问效率。例如:
#include
struct Person {
char name[20];
int age;
float height;
};
int main() {
struct Person person;
printf("结构体 Person 大小为: %zu 字节\n", sizeof(person));
return 0;
}
C 语言结构体为开发者提供了强大的数据组织和管理能力。通过合理运用结构体,我们能够创建复杂的数据结构,优化程序的性能与可读性。在实际编程中,深入理解结构体的特性,掌握其使用技巧,将有助于编写出高效、可靠的 C 语言程序。同时,关注结构体在内存中的布局,能有效避免因内存管理不当引发的问题,提升程序的稳定性。