当前位置: 首页 > java >正文

C语言 第六章 结构体(2)

目录

结构体嵌套

举例1:

举例2:

举例3:自我嵌套

结构体变量的赋值操作

例子:


结构体嵌套


结构体的成员也是变量,那么成员可以是基本数据类型,也可以是数组、指针、结构体等类型。如果结构体的成员是另一个结构体,这就构成了结构体嵌套。

举例1:

#include <stdio.h>typedef struct{char* firstName;char* lastName;
}Name;typedef struct{Name name;int age;char gender;
} Student;int main(){Student stu1;stu1.name.firstName = "美美";stu1.name.lastName = "韩";stu1.age = 18;stu1.gender = 'F';//或者Name name = {"美美","韩"};stu1.name = name;stu1.age = 18;stu1.gender = 'F';return 0;
}

举例2:

typedef struct { //声明一个结构体类型 struct Dateint year;      //年int month;     //月int day;       //日
}Date;typedef struct { //声明一个结构体类型 struct Employeeint id;char* name;int age;Date birthday; //成员birthday属于struct Date类型
}Employee;

声明结构体变量并调用成员

#include <stdio.h>int main(){Employee empl;empl.id = 1001;empl.name = "Tony";empl.age = 24;empl.birthday.year = 2001;empl.birthday.month = 3;empl.birthday.day = 12;return 0;}

说明:如果成员本身又属一个结构体类型,则要用若干个 .,一级一级地找到最低的一级的成员。比如,emp1.birthday.year。

赋值的时候还有多种写法:

#include <stdio.h>

int main() {
  //方式1:
  Employee emp1 = {1001, "Tony", 24, {1999, 10, 11}};


  //方式2:
  Date birthday = {2001, 5, 6};


  //方式3:
  Employee emp3 = {
    .id = 1003,
    .age = 24,
    .name = "Jerry",
    .birthday = {2001, 3, 16}
  };


  //方式4:
  Employee emp4 = {
    .id = 1003,
    .age = 27,
    .name = "Jerry",
    .birthday.year = 1998,
    .birthday.month = 8,
    .birthday.day = 12
  };

  return 0;
}


举例3:自我嵌套


单链表结构的结点定义如下:

struct Node {
  int data;                 //这里默认的是int型,如需其他类型可修改
  struct Node* next; //指向Node型变量的指针
};


结构体变量的赋值操作


同类型的结构体变量可以使用赋值运算符(=),赋值给另一个变量,比如 

student1 = student2; // 假设student1和student2定义为同类型的结构体变量

这时会生成一个新的副本。系统会分配一块新的内存空间,大小与原来的变量相同,把每个属性都复制过去,即原样生成了一份数据。
也就是说,结构体变量的传递机制是值传递,而非地址传递。这一点跟数组的赋值不同,使用赋值运算符给数组赋值,不会复制数据,只是传递地址。

例子:

struct Car {
double price;
char* name;
} a = {.name = "AudiA6", .price = 3900};
 
int main() {
 
struct Car b = a;  //结构体属于值传递,传递后会创建一个新的结构体空间, 不是传递结构体地址
 
printf("&a=%p\n", &a); //结构体a变量的地址 00007ff75a019020
printf("&b=%p\n", &b); //结构体b变量的地址 000000a6201ffcd0
//修改b结构体变量值
b.name = "宝马";
b.price = 40000;
printf("a.name=%s,a.price=%.2lf\n",a.name,a.price);     //a.name=AudiA6,a.price=3900.00
printf("b.name=%s,b.price=%.2lf\n",b.name,b.price);    //b.name=宝马,b.price=40000.00

}

:上例中,变量b是变量a的副本,两个变量的值是各自独立的,修改掉b.name不影响a.name.

http://www.xdnf.cn/news/4871.html

相关文章:

  • 大数据——Mac环境DataSpell集成Jupyter
  • 2025年5月通信科技领域周报(4.28-5.4):5G-A技术引领峰会通信 卫星通信加速全球化布局
  • 数据库系统概论(七)初识SQL与SQL基本概念
  • 小程序消息订阅的整个实现流程
  • 养生:开启健康生活的钥匙
  • buck和boost总结
  • B站pwn教程笔记-9
  • 使用 React Native实现鸿蒙开发的详细方案
  • 数据结构 集合类与复杂度
  • Windows平台下的Qt发布版程序打包成exe可执行文件(带图标)|Qt|C++
  • SPC:通过对抗性博弈,让LLM左右互搏提升性能
  • 【Linux】swap交换分区管理
  • 特殊版本,官宣永久免费
  • 从入门到深入:Vue.js 学习全攻略
  • C++ 模板方法模式详解与实例
  • 基于多模态大模型的十二指肠穿孔诊疗技术方案
  • NeurIPS 2024 | 工业质检缺陷检测相关论文梳理
  • el-table中合并表格后横向变高样式无效
  • 找不到自定义包出现报错ModuleNotFoundError: No module named
  • 基础编程题目集 6-9 统计个位数字
  • GAMES202-高质量实时渲染(Assignment 3)
  • Python 爬虫之 XPath 元素定位
  • 熔断机制的实战:高并发下怎么优雅“断电”保命?
  • MAE自监督大模型在医学报告生成中的应用
  • windows的rancherDesktop修改镜像源
  • 【kubernetes】通过Sealos 命令行工具一键部署k8s集群
  • 《盟重冰雪传奇》:战士玩法攻略!
  • day010
  • DJ舞曲音乐系统VIP会员等级在线支付音乐试听音乐下载酒吧电音CMS模块DJ资讯源码
  • 医疗问答检索任务的完整 Pipeline 示例