结构体 嵌套使用

1.结构体嵌套

<1>指向结构体的指针:struct student *p; struct student student1; p=&student1;
访问结构体变量成员的方式:p->age;(*p).age;sudent1.age;

<2>一个结构体做另一个结构体的成员

typedef struct item
{
 char first[10];
 char last[10];
 int grade;
}Item;
typedef struct node
{
 Item item;
 struct node *next;
}Node;

void main()
{
 Node *node;
 node = (Node *)malloc(sizeof(Node));

 //scanf("%s,%s,%d",item1.first,item1.last,&(item1.grade));
 scanf("%s",node->item.first);
 scanf("%s",node->item.last);
 scanf("%d",&(node->item.grade));
 printf("%s,%s,%d\n",node->item.first,node->item.last,node->item.grade);
}

<3>一个结构体指针做另一个结构体的成员。

typedef struct item
{
 char first[10];
 char last[10];
 int grade;
}Item;
typedef struct node
{
 Item *item;
 struct node *next;
}Node;

void main()
{
 Item *item;
 Node *node;
 item = (Item *)malloc(sizeof(Item));
 node = (Node *)malloc(sizeof(Node));

 node->item = item;
 gets(node->item->first);
 gets(node->item->last);
 scanf("%d",&(node->item->grade));
 printf("%s,%s,%d\n",node->item->first,node->item->last,node->item->grade);
}

注意:
<1>不能将结构体变量作为一个整体输入,输出,只能对其各个成员进行;
<2>允许将一个结构体变量赋给另一个用类型的结构体变量: student1=student2;
<3>结构体数组与数组不一样,一个结构的名字不是该结构的地址。
<4>建立链表时,main()里的Queue queue;不要定义为指针,若要定义为指针,须为其分配存储空间。
或者传递指针的指针(最好不用这种),否则不能改变指针的值。

2.用指针处理链表:

struct student {int num;float score;stuct student *next; };
处理动态链表所需函数:头文件stdlib.h中有malloc()free()的原型
void * malloc (unsigned int size);
//在动态存储区中分配一个长度为size的连续空间,此函数的值是一个分配域的起始地址(类型为 void)。如果函数为能成功执行则返回null;
void *calloc(unsigned n,unsinged size);
//在动态存储区中分配n个长度为size的连续空间,此函数的值是一个分配域的起始地址。如果函数为能成功执行则返回null;用calloc函数可以为一维数组开辟动态存储空间。
void free(void *p) ;//释放由p指向的动态存储区,p是最近一次调用malloc或calloc时返回的值。
ptr=(int *)malloc(n*sizeof(int));//n为一变量,C99之前允许,返回一指向int型的ptr(int*)calloc(100,sizeof(int));

3.向函数传递结构信息

<1>传递结构成员
<2>使用结构地址
<3>把结构作为参数传递

http://www.cnblogs.com/zhoutian220/p/3993142.html

### C语言结构体嵌套使用方法 #### 定义嵌套结构体 在C语言中,可以通过两种方式定义嵌套结构体。一种是在外部声明所有结构体后再创建嵌套关系;另一种是直接在内部声明新类型的结构体并立即用于当前结构体内。 ```c // 方法一:先单独定义各个子结构体再组合成父级结构体 typedef struct { int day; int month; int year; } Date; typedef struct { char name[50]; float salary; Date joinDate; // 这里引用之前已经定义好的日期型结构体 } Employee; ``` 对于第二种情况,则可以在同一个`struct`语句内完成全部工作: ```c // 方法二:直接在大括号里面定义新的匿名结构体变量 typedef struct { char name[50]; float salary; struct { // 开始一个新的未命名的结构体定义 int day; int month; int year; } joinDate; } Employee; ``` 这两种写法都能实现相同的功能,在实际编程时可根据个人喜好或团队编码规范来选择合适的方式[^1]。 #### 初始化与访问成员 当涉及到初始化含有其他复杂数据类型的对象时,可以采用复合字面量语法来进行赋值操作。下面展示如何给上述例子中的员工信息设置初始值以及读取其入职时间的信息。 ```c #include <stdio.h> int main() { // 创建Employee实例并初始化 Employee emp = {"张三", 8000, (Date){12, 11, 2018}}; printf("员工姓名:%s\n", emp.name); printf("工资金额:%.2f元\n", emp.salary); printf("入职日期:%d/%d/%d\n", emp.joinDate.day, emp.joinDate.month, emp.joinDate.year); return 0; } ``` 这段程序会输出如下内容: ``` 员工姓名:张三 工资金额:8000.00元 入职日期:12/11/2018 ``` 通过这种方式,不仅能够清晰表达不同实体之间的关联性,而且使得代码更加模块化易于维护和扩展[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值