目录
1. 定义结构
2. 结构体变量的初始化
3. 访问结构成员
4. 结构作为函数参数
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。
结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。
struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct 结构体名称 {
数据类型 成员1名称;
数据类型 成员2名称;
...
数据类型 成员n名称;
} 结构体变量1, 结构体变量2, ... , 结构体变量m;
其中,结构体名称是自定义的标识符,用于标识这个特定的结构体类型。成员名称是结构体内部数据项的名称,成员的数据类型可以是整型、浮点型、字符型、指针类型、数组类型等。结构体变量是声明该结构体类型的实例,可以用于存储具体的数据。
例如,下面是一个用于描述矩形的结构体定义:
struct Rectangle {
int width;
int height;
} rect1, rect2;
该结构体包含了两个整型数据成员 width 和 height,用于表示矩形的宽度和高度。通过上述定义,我们定义了一个名为 Rectangle 的新的结构体类型,并声明了两个结构体变量 rect1 和 rect2。这样,我们就可以使用这两个结构体变量来存储具体的矩形数据。
//此声明声明了拥有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;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
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 = 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\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;
}
结构体可以作为函数的参数进行传递,这样可以方便地将多个相关的数据一起传递给函数。
在将结构体作为函数参数时,有两种常用的方式:
通过值传递:将整个结构体作为参数传递给函数,函数内部会创建一个新的结构体副本。这样,函数对结构体的修改不会影响原始结构体。
通过指针传递:将结构体的指针作为参数传递给函数,函数可以直接操作原始结构体的数据。这样,函数对结构体的修改会影响原始结构体。
以下是两种方式的示例代码:
#include
struct Rectangle {
int width;
int height;
};
// 通过值传递结构体
void printRectangleByValue(struct Rectangle rect) {
printf("Width: %d, Height: %d\n", rect.width, rect.height);
}
// 通过指针传递结构体
void printRectangleByPointer(struct Rectangle* rectPtr) {
printf("Width: %d, Height: %d\n", rectPtr->width, rectPtr->height);
}
int main() {
struct Rectangle rect = {10, 20};
// 通过值传递结构体
printRectangleByValue(rect);
// 通过指针传递结构体
printRectangleByPointer(&rect);
return 0;
}
在上述代码中,我们定义了一个名为 Rectangle
的结构体类型。然后,我们通过两个函数 printRectangleByValue
和 printRectangleByPointer
分别演示了通过值传递和指针传递结构体作为参数的用法。在 main
函数中,我们创建了一个结构体变量 rect
,并将其传递给这两个函数进行打印。
需要注意的是,通过指针传递结构体能够提高效率,因为不需要复制整个结构体。但要确保传递的结构体指针有效,即指向已经分配内存空间的结构体。
C语言菜鸟入门·运算符(算数运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,三目运算符)详细介绍-CSDN博客
C语言菜鸟入门·函数-CSDN博客
C语言菜鸟入门·判断语句(if语句、if...else语句、嵌套if语句)详细介绍-CSDN博客