C语言——结构体数组和结构体指针

一、结构体数组

第一种方法是在声明结构体的时候进行定义:

struct 结构体名称
{
    结构体成员;
}数组名[长度]

第二种方法是先声明一个结构体类型,再用此类型定义一个结构体数组:

struct 结构体名称
{
    结构体成员;
};
struct 结构体名称 数组名[长度]

二、初始化结构体数组

struct Book book[3] = { 
    {"《考上耶鲁》","mou",48.8,{2017,11,11},"耶鲁大学出版社"}
    {"《考上耶鲁》","mou",48.8,{2017,11,11},"耶鲁大学出版社"}
    {"《考上耶鲁》","mou",48.8,{2017,11,11},"耶鲁大学出版社"}
};

三、结构体指针

struct Book * ptr;
pt = &book;
/* 不要以为跟数组差不多,数组名是地址,结构体不是,要加上&得到book的地址,然后赋值给pt(指针变量)*/

通过结构体指针访问结构体成员的两种方法

(*结构体指针). 成员名因为.运算符的优先级高于* 所以加上括号先解引用
结构体指针->成员名推荐这种方式 更实用

 

### 如何在C语言中对结构体数组进行排序 为了实现对结构体数组的排序,在C语言中通常会定义一个比较函数来指定排序依据。此方法可以应用于各种数据结构,因为这些结构有助于高效的数据操作[^2]。 下面是一个具体的例子,展示如何按照特定字段对学生记录(作为结构体)组成的数组进行升序排列: #### 定义学生结构体并初始化数组 ```c #include <stdio.h> #include <string.h> // Define a structure named Student. typedef struct { char name[50]; int age; } Student; int compare_by_age(const void* _a, const void* _b); int main() { // Initialize an array of students. Student students[] = {{"Alice", 23}, {"Bob", 21}, {"Charlie", 22}}; size_t length = sizeof(students)/sizeof(Student); } ``` #### 实现比较函数用于qsort调用 ```c // Comparison function compares two Students based on their ages. int compare_by_age(const void* _a, const void* _b) { const Student *a = (Student*)_a; const Student *b = (Student*)_b; if(a->age < b->age){ return -1; } else if(a->age > b->age){ return 1; } else{ return 0; } } void print_students(Student* s, size_t n){ for(size_t i=0;i<n;++i){ printf("%s %d\n", s[i].name,s[i].age ); } } ``` #### 排序过程以及结果打印 ```c int main(){ ... qsort(students, length, sizeof(Student), compare_by_age); // Sort by age using standard library's qsort puts("After sorting:"); print_students(students,length); return 0; } ``` 上述代码展示了完整的流程:从定义`Student`类型的结构体到创建该类型对象的数组;接着实现了基于年龄属性对比两个实例大小的关系运算符重载形式——即`compare_by_age()`函数;最后通过标准库提供的快速排序算法完成实际排序工作,并输出最终的结果列表。 值得注意的是,当涉及到更复杂的嵌套结构时,比如包含指向其他结构指针的情况,则需特别注意内存管理方面的问题,确保所有涉及的对象都已正确定义分配了足够的空间才能安全使用[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值