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

C语言-结构体嵌套

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct Name {
    char firstName[10];
    char lastName[20];
};

struct Student {
    char sno[20];//学号
    struct Name name;
    int age;
    char gender;
};

1、自我嵌套 单链表结构的结点定义如下

//方式1
struct Node {
    int data;
    struct Node* next;
};
//方式2
typedef struct Node {
    int data;
    struct Node* next;
}LNode;

2、二叉树结构的结点定义如下:

typedef struct Binarrytree {
    int data;
    struct Binarrytree* lchild;//左孩子结点指针
    struct Binarrytree* rchild;//右孩子结点指针
};

3、结构体嵌套

int main() {
    //1.定义结构体变量
    //直接赋值
    struct Student s1 = { "1001",{"旭阳","王"},18,'M' };
    printf("%s %s\n", s1.name.firstName, s1.name.lastName);//旭阳 王
    //先定义变量,再赋值
    struct Student s2;
    strcpy(s2.sno,"1002");
    strcpy(s2.name.firstName, "longlong");
    strcpy(s2.name.lastName, "yu");
    s2.age = 18;
    s2.gender = 'M';

    printf("%s %s %s %d %c\n", s2.sno, s2.name.firstName, s2.name.lastName, s2.age, s2.gender);     //1002 longlong yu 18 M
    printf("%s %s %s %d %c\n", (&s2)->sno, (&(&s2)->name)->firstName, (&(&s2)->name)->lastName, (&s2)->age, (&s2)->gender);     //1002 longlong yu 18 M

    //结构体之间用=赋值,相当于做了深拷贝
    s1 = s2;//直接赋值
    s1.age = 10;
    printf("%s %s %s %d %c\n", s1.sno, s1.name.firstName, s1.name.lastName, s1.age, s1.gender);//1002 longlong yu 10 M
    printf("%s %s %s %d %c\n", s2.sno, s2.name.firstName, s2.name.lastName, s2.age, s2.gender);//1002 longlong yu 18 M

    //数组之间用=赋值,浅拷贝
    int arr[3] = { 1,2,3 };
    int* ptr = arr;
    arr[0] = 100;
    printf("%d %d %d\n", arr[0], arr[1], arr[2]);//100 2 3
    printf("%d %d %d\n", ptr[0], ptr[1], ptr[2]);//100 2 3
    return 0;
}

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


二、结构体变量赋值操作
同类型的结构体变量可以使用赋值运算符(=),赋值给另一个变量
这时会生成一个全新副本。系统会分配一块新的内存空间,大小与原来的变量相同,把每个属性都复制过去,即原样生成了一份数据。
结构体变量的传递机制是值传递

验证结构体赋值:值传递、深拷贝

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct Car {
    char name[20];
    double price;
};
int main() {
    //验证结构体之间的赋值是传值——深拷贝
    struct Car a = { "Audi A6L",390000.88 };
    struct Car b = { "BMW X5", 500000.00 };
    a = b;
    printf("%p %p\n", &a, &b);  //地址不同 0000005E84CFF508 0000005E84CFF548
    printf("%s %s\n", (&a)->name, (&b)->name);//BMW X5   BMW X5
    a.name[0] = 'H';
    printf("%s %s\n", (&a)->name, (&b)->name);//HMW X5   BMW X5
    return 0;
}


http://www.kler.cn/a/455665.html

相关文章:

  • xshell基础设置
  • 学习笔记(C#基础书籍)-- C#高级应用
  • PCA降维MATLAB代码解释及应用场景
  • 贪心算法.
  • c++ 命名空间使用规则
  • 在交叉编译中,常见的ELF(elf)到底是什么意思?
  • 服务器数据恢复—Lustre分布式文件系统下服务器节点进水的数据恢复案例
  • 【网络工程师教程】六、网络互联与互联网
  • github codespaces推送镜像时unauthorized: access token has insufficient scopes 解决方法
  • 云服务器yum无法解析mirrorlist.centos.org
  • 网安瞭望台第17期:Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析
  • oracle基础:理解 Oracle SQL 中的 WHERE 后的 (+) 用法
  • 在k8s上使用strimzi operator安装kafka集群
  • selenium学习笔记(二)
  • 模型工作流:自动化的模型内部三角面剔除
  • ID卡网络读卡器Python小程序开发
  • Python软体中简化版MapReduce任务的实现:处理大量日志数据
  • spring security 超详细使用教程(接入springboot、前后端分离)
  • 研发效率提升
  • USB免驱IC读卡器QT小程序开发
  • Hive SQL 之 `LATERAL VIEW EXPLODE` 的正确打开方式
  • DS的使用
  • StarRocks 排查单副本表
  • Kotlin 语言基础语法及标准库
  • [2029].第6-06节:MyISAM引擎中的索引与 InnoDB引擎中的索引对比
  • C# 线程安全集合