10.结构体、共用体、枚举

头文件:#include<string.h>

结构体定义
//struct:结构体关键字
//stu:结构体类型名,指定了一个结构体类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际内存单元

//使用结构体类型必须是struct stu
//num name age叫做结构体中的成员
//定义结构体类型的时候不要给成员赋值(重要)
//定义结构体类型的时候 并没有分配空间 所以不能给成员赋值       

struct stu 
{
    int num;
    char name[32];
    int age;
};        //一定要记得有;号

结构体中的成员拥有独立的空间

结构体独立空间

知识点二:结构体变量的定义

struct stu
{
    int num;	//4B
    char name [32];//32B
    int age;	//4B
};

void test1(void)
{
    //就用结构体类型定义一个变量
    struct stu lucy;	//lucy 是局部变量 lucy的成员内容不确定
    //通过结构体变量访问结构体中的成员(访问时一定要遵循成员自身的类型)
    lucy.num = 100;
    strcpy (lucy.name,"德玛西亚");
    lucy.age = 18;

    printf("num = %d\n",lucy.num);
    printf("name = %s\n",lucy.name);
    printf("age = %d\n",lucy.age);
}

知识点三:结构体变量的初始化

struct stu
{
    int num;		//4B
    char name [32];	//32B
    int age;		//4B
};

void test1(void)
{
    //初始化的顺序必 须和 结构体成员的顺序一致
    struct stu lucy = {100,"德玛西亚",18};
    printf(" num = %d,name = %s,age = %d\n", lucy.num,lucy.name,lucy.age);
    //清空结构体变量
    memset(&lucy,0,sizeof(lucy));
}

知识点四:结构体变量获取键盘输入

struct stu
{
    int num;		//4B
    char name [32];	//32B
    int age;		//4B
};
void test1(void)
{
    struct stu lucy;
    memset(&lucy,0,sizeof(lucy));
    printf("请输入num name_age:") ;
    //&lucy.num取的是num成员地址
    scanf("%d %s %d",&lucy.num,&lucy.name,&lucy.age);
    printf("num = %d,name = %s,age = %d\n",lucy.num,lucy.name,lucy.age);
}

知识点五:结构体变量之间的赋值

内存拷贝

memcpy:内存块中的数据从一个地方复制到另一个地方

memcpy(void *str1, const void *str2, size_t n);
参数说明:
    str1:指向用于存储复制内容的目标数组,类型强制转换为 void* 指针
    str2:指向要复制的数据源,类型强制转换为 void* 指针
    n:要被复制的字节数
struct stu
{
    int num;		//4B
    char name [32];	//32B
    int age;		//4B
};
void test1(void)
{
    struct stu lucy = {100,"小法",18} ;
    struct stu bob;
    //需求将lucy的值赋值bob
    //方式一:逐个成员赋值
    //bob.num = lucy.num;
    //strcpy(bob.name,lucy.name);
    //bob.age = lucy.age;
    //方拾二:相同类型的结构体变量 可以直接赋值(推荐)
    //bob = lucy;    
    //方法三:方法二的底层实现
    memcpy(&bob, &lucy,sizeof(struct stu));
    printf("num = %d,name = %s,age = %d\n",bob.num,bob.name,bob.age);
}

知识点六:结构体数值

结构体数值
struct stu
{
    int num;		//4B
    char name [32];	//32B
    int age;		//4B
};
void test1(void)
{
    struct stu arr[5]={
        {100,"小法",18},
        {101,"德玛西亚",19},
        {102,"盲僧",20},
        {103,"快乐风男",30},{104,"提莫",8}};
    int n = sizeof(arr)/sizeof(arr[0]);
    int i = 0;
    for(i = 0;i < n;i++)
    {
        printf("num = %d,name = %s,age = %d\n",arr[i].num, arr[i].name,arr[i].age);
    }
}

知识点七:冒泡排序

冒泡排序
#include<stdio.h>
#include<stdlib.h>
void test1(void)
{
    int n = 0;
    int i,j = 0;
    int *arr = NULL;
    printf("请输入数据的个数:");
    scanf ("%d",&n);
    //根据元素的个数申请空间
    arr = (int *)calloc(n,sizeof(int));
    if(NULL == arr)
    {
        perror("calloc");
        return;
    }
     //键盘给动态数组获取输入
    printf("请输入%d个int数据\n",n);
    for(i = 0;i < n;i++)
    {
        scanf("%d",arr+i);//arr+i 第i个元素的地址
    }
    //排序
    for(i = 0;i < n-1;i++)
    {
        for(j = 0; j < n-i-1;j++)
        {
            if(arr[j] > arr[j+1])    //从小到大排列 
            {
                int tmp = 0;
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }            
        }        
    }
    //数组的遍历
    for(i = 0;i < n; i++)
    {
        printf("%d ",arr[i]);        
    }
    printf("\n");
    //释放空间
    if(arr != NULL)
    {
        free(arr) ;
        arr = NULL;
    }
}

升级版

#include<stdio.h>
#include<stdlib.h>
void test1(void)
{
    int n = 0;
    int i,j = 0;
    int *arr = NULL;
    printf("请输入数据的个数:");
    scanf ("%d",&n);
    //根据元素的个数申请空间
    arr = (int *)calloc(n,sizeof(int));
    if(NULL == arr)
    {
        perror("calloc");
        return;
    }
     //键盘给动态数组获取输入
    printf("请输入%d个int数据\n",n);
    for(i = 0;i < n;i++)
    {
        scanf("%d",arr+i);	//arr+i 第i个元素的地址
    }
    //排序
    for(i = 0;i < n-1;i++)
    {
        int flag = 0; 
        for(j = 0; j < n-i-1; j++)
        {
            if(arr[j] > arr[j+1])    //从小到大排列 
            {
                int tmp = 0;
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }            
        }
        if(flag == 0)    //数组已经有序 
        break;        
    }
    //数组的遍历
    for(i = 0;i < n; i++)
    {
        printf("%d ",arr[i]);        
    }
    printf("\n");
    //释放空间
    if(arr != NULL)
    {
        free(arr);
        arr = NULL;
    }    
}

结构体数组排序

#include<stdio.h>
#include<string.h>
struct stu
{
    int num;		//4B
    char name [32];	//32B
    int age;		//4B
};

void test1(void)
{
    struct stu arr[5];
    int i,j = 0;
    int n = sizeof (arr)/sizeof(arr[0]);
    memset (arr,0,sizeof(arr));		//整个数组清0
    //获取键盘输入
    printf("请输入%d个学生信息\n",n) ;
    for(i=0;i<n; i++)
    {
        scanf("%d %s %d",&arr[i].num,arr[i].name,&arr[i].age);
    }
    //根据学号排序
    for(i = 0;i < n-1;i++)
    {
        for(j = 0; j < n-i-1;j++)
        {
            if(arr[j].num < arr[ j+1].num) //按照num的从大到小排序
            {
                struct stu tmp;
                tmp = arr[j] ;
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }        
    }
    //遍 历
    printf("--------------\n") ;
    for(i = 0;i < n;i++)
    {
        printf("%d %s %d\n",arr[i].num,arr[i].name,arr[i].age);
    }
}

知识点八:typedef 给已有的类型取个别名

1、给int取个别名INT32

#include<stdio.h>
// typedef使用步骤:
//1、先用已有的类型_ 定义一个变量      int num;
//2、用别名替换变量名            	int INT32;
//3、在整个表达式前添加typedef        typedef int INT32;
//注意:不能创造新的类型
typedef int INT32;
void test1()
{
    INT32 num = 10;
    printf("num = %d\n",num);//10
}

2、给数组取个别名

//ARR_TYPE 就是数组类型,该数组必须有5个元素 每个元素为int
typedef int ARR_TYPE[5];
void test1()
{
    ARR_TYPE arr = {10, 20, 30, 40, 50}; //arr就是一个拥有5个元素每个元素为int的数
    int i = 0;
    for(i = 0;i < 5;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n") ;
}

3、给指针取别名

typedef int *P_TYPE;
void test1()
{
    int num = 10;
    P_TYPE p = &num;    //P_TYPE p == int *p
    printf("*p = %d\n", *p);	//10 
}

4、给函数指针取别名

int my_add(int x,int y)
{
    return x+y;
}
//FUN_P是一个函数指针类型 该函数必须有两个int形参以及一个int返回值
typedef int (*FUN_P)(int x, int y);
void test1()
{
    FUN_P p = my_add;
    printf("%d\n",p(100,200));    //300;
}

5、给结构体类型取个别名

typedef struct stu
{
    int num;
    char name[32];
    int age;
}STU;    //STU == struct stu
void test1()
{
    STU lucy = {100,"lucy",18};
}

知识点九:结构体指针

结构体指针
typedef struct stu
{
    int num;
    char name[16];
    int age;
}STU;    //STU是结构体类型
void test1()
{
    STU lucy = {100,"lucy",18};
    STU *p = &lucy;
    printf("num = %d,name = %s,age = %d\n",lucy.num,lucy.name,lucy.age);
    //注意:如果是结构体指针需要用下面两种方式输出
    printf("num = %d,name = %s,age = %d\n",(*p).num,(*p).name,(*p).age);
    printf("num = %d,name = %s,age = %d\n",p->num,p->name,p->age);
    printf("num = %d\n",(&lucy)->num);
}

知识点十:结构体指针作为函数的参数

#include<stdio.h>
#include<string.h>

typedef struct stu
{
    int num;
    char name[16];
    int age;
}STU;    //STU是结构体类型
void mySetSTUData(STU *p)	//p=&lucy
{
    printf("请输入一个学生的信息num name age\n");
    scanf("%d %s %d",&p->num,p->name,&p->age);
    return;
}
void myPrintSTUData(const STU *p)	//tmp =lucy    *p只读 
{
    //constSTU*p不允许用户借助p修改 p所指向的空间内容
    printf("num = %d,name = %s,age = %d\n",p->num,p->name,p->age);
}
void test1()
{
    STU lucy;
    memset(&lucy,0,sizeof(lucy));
    //定义一个函数给lucy的成员获取键盘输入
    mySetSTUData(&lucy);
    //定义一个函数 打印lucy的成员信息
    myPrintSTUData(&lucy);    
}

知识点十一:结构体内存对齐

结构体内存对齐

对齐规则:

对齐规则
struct data 
{
    char c;	// 1B
    int i;	//4B
};
void test1()
{    
    //结构体的大小>=成员大小之和
    printf("%d\n",sizeof(struct data));	//8
    struct data d;
    printf("&d.c = %u\n",&d.c);
    printf("&d.i = %u\n",&d.i);
}

知识点十二:结构体嵌套结构体

结构体嵌套结构体
typedef struct
{
    int x;
    int y;
}DATA2;
typedef struct
{
    int a;
    int b;
    DATA2 c;	//结构体变量c作为了DATA3的成员叫结构体嵌套结构体
}DATA3;
void test1()
{    
    //DATA3 data = {10, 20, 30, 40};
    DATA3 data = {10,20, {30,40}};	//推荐
    printf("a = %d\n",data.a);
    printf("b = %d\n",data.b);
    printf("x = %d\n",data.c.x);    //访问最底层 
    printf("y = %d\n",data.c.y);
}

知识点十三:结构体嵌套结构体的内存对齐

内存对齐
typedef struct
{
    short d;
    char e;
}DATA2;
typedef struct
{
    short a;
    int b;
    DATA2 c;
    char f;
}DATA;
void test1()
{    
    printf("%d\n", sizeof(DATA));
    DATA data;
    printf ("a:%u\n",&data.a);
    printf("b:%u\n",&data.b);
    printf("c中d: %u\n",&data.c.d);
    printf("c中e: %u\n", &data.c.e);
    printf("f:%u\n",&data.f);
}

知识点十四:指定对齐原则

1、使用#pragmapack改变默认对其原则

格式:#pragma pack (value) 时的指定对齐值value

注意:

     1)value只能是:1248等

     2)指定对齐值与数据类型对齐值相比取较小值

     如:如果指定对齐值:

          设为1:则short、 int、 float等均为1

          设为2:则char仍为1,short为2,int变为2

步骤:

     1)确定分单位:每一 -行应该分配的字节数,min(value,默认分配单位)

     2)成员偏移量=成员自身类型的整数(0~n)倍

     3)收尾工作=分配单位的整数(0~n) 倍

//指定对齐规则
#pragma pack(2)
typedef struct
{
    char a;
    int b;
    short C;
}DATA1;

void test1()
{    
    printf ("%d\n",sizeof(DATA1));    //8
    return;
}

知识点十五:位段

位段

位段的使用

//位段 一般只考虑unsigned int类型也可以考虑unsi gned char
typedef struct
{
    unsigned char a:2;	//a只占一个字节中的两位二进制位
    unsigned char b:2;	//b只占一个字节中的两位二进制位
    //相邻位域可以压缩( 压缩的位数 不能超过  成员自身大小)
    unsigned char c:5;
}DATA2;
void test1()
{    
    printf ("%d\n",sizeof(DATA2));	//2
    DATA2 data;
    //位段不能取地址
    //printf("%p\n",&data.a);
    //位段的赋值不要操作位段的大小a:2
    data.a = 6;    //0110
    printf("%u\n",data.a);    //2
    return;
}

无意义位段

无意义位段
typedef struct
{
    unsigned char a:2;	//00
    unsigned char :4;	//无意 义的位段( 占有两位)
    unsigned char b:2;	//1 1
}DATA3;

void test1()
{    
    DATA3 data;
    memset (&data,0,1);
    data.a = 0;    //00
    data.b = 3;    //11
    printf("%d\n", sizeof(DATA3));
    printf("%#x\n",*(unsigned char *)&data);    //1100 0000/ /0xc0  a是高位,b是低位
    return;
}

应用场景

应用场景

另起一个位段

另起一个位段
typedef struct
{
    unsigned char a:2;   //00
    unsigned char :0;    //另起一个位段
    unsigned char b:2;   //11
}DATA4;
void test1()
{    
    printf ("%d\n",sizeof(DATA4));
    return;
}

知识点十六:共用体与结构体的区别

结构体:struct

所有的成员拥有独立的空间

共用体与结构体的区别
struct stu
{
    char a;
    short b;
    int C;
};	// a  b  c成员有用独立的空间

共用体(联合体)union

所有的成员共享同一份空间

共用体与结构体的区别1
struct stu
{
    char a;
    short b;
    int c;
};	// a  b  c成员有用共享一份空间

知识点十七:共用体

union data
{
    char a;
    short b;
    int c;
};
void test1()
{    
    printf("%d\n",sizeof(union data));	//4
    union data A;
    A.a = 10;
    A.b = 20;
    A.c = 30;
    printf("%d\n",A.a + A.b + A.c);    //90
}

共用体虽然共有同一份空间但是从空间读取的字节数是有成员自身类型决定

共用体1 共用体2
union data
{
    char a;
    short b;
    int c;
};
void test1()
{    
    printf("%d\n", sizeof(union data));	//4
    union data A;
    A.c = 0x01020304;
    A.b = 0x0102;
    A.a = 0x01;
    printf("%#x\n",A.a+A.b+A.c);    
}

知识点十八:枚举

枚举

     将变量的值一一列举出来,变量的值只限于列举出来的值的范围内

枚举类型定义:

enum 枚举名
{
    枚举值表
};

在枚举值表中应列出所有可用值,也称为枚举元素,枚举变量仅能取枚举值所列元素

//枚举列表的值:默认从0开始
enum POKER {HONGTAO,HEITAO=30,MEIHUA=40,FANGKUAI};
void test1()
{    
    //poker_ color的取值为HONGTAO,HEITAO, MEIHUA, FANGKUAI中某一个
    enum POKER poker_color = HEITAO;
    printf("poker_ olor = %d\n",poker_color);    //30
    printf("HONGTAO = %d\n",HONGTAO);   //0
    printf("HEITAO = %d\n",HEITAO);    	//30
    printf("MEIHUA = %d\n",MEIHUA);    	//40
    printf("FANGKUAI = %d\n",FANGKUAI); //41
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/695871.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Windows】UWP - Application Frame 窗口句柄溯源

目录 一、问题描述 二、解决方案 三、测试代码 参考文献 本文出处链接&#xff1a;[https://blog.csdn.net/qq_59075481/article/details/139574981]。 一、问题描述 当 GUI 线程的窗口属于 Windows/UWP 应用程序时&#xff0c;它们始终由进程 ApplicationFrameHost 托管…

Matlab|混合策略改进的蝴蝶优化算法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要对蝴蝶算法&#xff08;BOA&#xff09;进行改进&#xff0c;参考文献《基于改进蝴蝶优化算法的冗余机器人逆运动学求解》&#xff0c;有如下改进策略&#xff1a; 改进1&#xff1a;采用反向学习策…

2024 年最佳 iPhone 数据恢复软件

最好的 iPhone 数据恢复软件是什么&#xff1f; 说到 iPhone 数据恢复&#xff0c;拥有合适的软件对于恢复丢失或删除的文件至关重要&#xff0c;无论是照片、视频、消息、联系人还是其他重要数据。那么&#xff0c;最好的 iPhone 数据恢复软件是什么&#xff1f;有几个因素有…

信息学奥赛初赛天天练-25-CSP-J2023基础题-中序、前序与后序转换秘籍,二叉树构建、遍历技巧,以及图的拓扑排序实战应用

PDF文档公众号回复关键字:20240610 2023 CSP-J 选择题 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 11 给定一棵二叉树&#xff0c;其前序遍历结果为&#xff1a;ABDECFG&#xff0c;中序遍历结果…

线性代数|机器学习-P11方程Ax=b求解研究

文章目录 1. 变量数和约束条件数大小分类2. 最小二乘法和Gram-schmidt变换2.1 Gram-schmidt变换2.2 最小二乘法2.2.1 损失函数-Lasso 和regression2.2.2 损失函数-Lasso2.2.3 损失函数-regression2.2.4 Regression岭回归-矩阵验证2.2.5 Regression岭回归-导数验证 3. 迭代和随机…

重新认识Word —— 制作简历

重新认识Word —— 制作简历 PPT的图形减除功能word中的设置调整页边距进行排版表格使用 我们之前把word长排版文本梳理了一遍&#xff0c;其实word还有另外的功能&#xff0c;比如说——制作简历。 在这之前&#xff0c;我们先讲一个小技巧&#xff1a; PPT的图形减除功能 …

Elasticsearch:Open Crawler 发布技术预览版

作者&#xff1a;来自 Elastic Navarone Feekery 多年来&#xff0c;Elastic 已经经历了几次 Crawler 迭代。最初是 Swiftype 的 Site Search&#xff0c;后来发展成为 App Search Crawler&#xff0c;最近又发展成为 Elastic Crawler。这些 Crawler 功能丰富&#xff0c;允许以…

Typora Markdown编辑器 for Mac v1.8.10 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2. 应用程序显示软件图标&#xff0c;表示安装成功 三、运行调试1、修改主题2、显示文档列表&#xff0c;如下图3、查看版本信息 **安装完成&…

LearnDash+BuddyBoss:终极在线课程社区组合

您是否希望使用 WordPress 建立在线课程社区&#xff1f; 如果是这样&#xff0c;没有比LearnDash和BuddyBoss在线课程社区更好的组合了。使用这两款产品&#xff0c;您可以创建和销售在线课程、创建群组和讨论&#xff0c;并为您的学生提供整个社交网络&#xff0c;所有这些都…

CUDA 编程(1):使用Grid 和 Block分配线程

1 介绍 1.1 Grid 和 Block 概念 核函数以线程为单位进行计算的函数,cuda编程会涉及到大量的线程(thread),几千个到几万个thread同时并行计算,所有的thread其实都是在执行同一个核函数。 对于核函数(Kernel),一个核函数一般会分配1个Grid, 1个Grid又有很多个Block,1个Bloc…

【python】python GUI编程--tkinter模块初探

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【大学物理】波动光学:光的衍射

大学物理(上) 可视化详解学习&#xff01;| 第五讲 | 31分钟学习 光的干涉与衍射_哔哩哔哩_bilibili 第13章 波动光学-4 光的衍射-1 单缝衍射_哔哩哔哩_bilibili 0 definition 衍射也是波的性质之一&#xff0c;指的是波遇到障碍物时不再沿直线传播&#xff0c;进入障碍物背…

贪吃蛇双人模式设计(2)

敲上瘾-CSDN博客控制台程序设置_c语言控制程序窗口大小-CSDN博客贪吃蛇小游戏_贪吃蛇小游戏csdn-CSDN博客​​​​​​​ 一、功能实现&#xff1a; 玩家1使用↓ → ← ↑按键来操作蛇的方向&#xff0c;使用右Shift键加速&#xff0c;右Ctrl键减速玩家2使用W A S D按键来操…

NFT 智能合约实战-快速开始(1)NFT发展历史 | NFT合约标准(ERC-721、ERC-1155和ERC-998)介绍

文章目录 NFT 智能合约实战-快速开始(1)NFT发展历史国内NFT市场国内NFT合规性如何获得NFT?如何查询NFT信息?在 OpenSea 上查看我们的 NFT什么是ERC721NFT合约标准ERC-721、ERC-1155和ERC-998 对比ERC721IERC721.sol 接口内容关于合约需要接收 ERC721 资产 onERC721Received…

使用Leaflet-canvas-label进行个性化标注实践详解

目录 前言 一、leaflet-canvas-label属性 1、地图展示属性 2、Canvas文本标注属性 3、事件列表 二、属性设置实战 1、标注放大比例 2、字体颜色和方向偏移 3、标注文字透明色设置 4、标注显示层级 三、事件绑定 1、颜色改变 2、事件绑定解析 3、标记初始化的一个小…

数据结构(4):串

只需要掌握小题&#xff0c;在考纲中占比不大 1 串的定义 1.1 基本定义 字符串 数据结构三要数&#xff1a;逻辑结构、存储结构、运算 子串必须是连续的&#xff01; 空格也是一个字符&#xff01;每个空格字符占1B 1.2 串和线性表 2 串的基本操作 比值的操作&#xff01;&…

定个小目标之刷LeetCode热题(13)

今天来看看这道题&#xff0c;介绍两种解法 第一种动态规划&#xff0c;代码如下 class Solution {public int maxSubArray(int[] nums) {int pre 0, maxAns nums[0];for (int x : nums) {// 计算当前最大前缀和pre Math.max(pre x, x);// 更新最大前缀和maxAns Math.ma…

入门级的卷积神经网络训练识别手写数字-小白轻松上手-含数据集+pyqt界面

代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89374845 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文…

arm开发板移植sshd

移植sshd 文章目录 移植sshd1、准备工作2、编译zlib3、编译openssl4、编译openssh5、其他旧版本6、部署测试7、多用户配置8、sshd_config示例 1、准备工作 准备openssh-9.5p1.tar.gz openssl-1.1.1w.tar.gz zlib-1.2.11.tar.gz 我在http://10.45.156.100/IG2100/IG2100.git …

向AI请教如何说不

面对父母的催婚&#xff0c;你可以采取以下几个步骤来进行沟通和表达自己的立场&#xff1a; 理解与尊重&#xff1a;首先&#xff0c;要理解父母催婚背后的关心和期望。他们可能出于对你未来幸福和生活稳定的考虑。表达对他们关心的感激&#xff0c;这有助于建立良好的沟通基础…