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

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.

相关文章:

  • MySQL核心内容【持续更新中】
  • 简述Linux操作系统并安装配置Linux
  • 26考研——中央处理器_指令执行过程(5)
  • 【 SVG动态拼接】前端生成阻抗电路图
  • 仁合医疗核心产品:引领医疗科技新潮流
  • LLM量化方法:ZeroQuant、LLM.int8()、SmoothQuant、GPTQ、AWQ
  • CRC 循环冗余校验
  • Vue3 + Element Plus 动态表单实现
  • vscode离线安装python插件
  • git高效杀器——cz-customizable 搭配 commitlint
  • 抖音到店摸着京东外卖过河
  • 树初步 #1(插排串联 - 辽宁省2024CCPC)
  • 【八股消消乐】你在项目中如何优化垃圾回收机制?
  • 动态规划之背包问题:组合优化中的经典NP挑战
  • 基于vue框架的电子商城m8qu8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • WPDRRC 模型:构建动态闭环的信息安全防御体系
  • 【RAG】重点部分 RAG-Fusion, Decomposition, HyDE 和 Routing
  • apipost快捷使用实例
  • 耳机插进电脑只有一边有声音怎么办 解决方法分享
  • Java——包装类
  • 全国人大常委会启动食品安全法执法检查
  • 5月12日至13日北京禁飞“低慢小”航空器
  • 光大华夏:近代中国私立大学遥不可及的梦想
  • 视频|漫画家寂地:古老丝路上的文化与交流留下的独特印记
  • 现场|万里云端,遇见上博
  • 过半中国上市公司去年都在“扩编”,哪些公司人效最高