首页 > 其他分享 >自定义类型:结构体

自定义类型:结构体

时间:2024-09-25 12:18:54浏览次数:3  
标签:20 struct 自定义 int char printf 类型 结构

1.结构体类型的声明

struct tag
{
member-list;
}variable-list;

例如描述一个学生:

struct Stu
{
   char name[20];//名字
   int age;//年龄
   char sex[5];//性别
   char id[20];//学号
}; //分号不能丢
struct Stu
{
   char name[20];//名字
   int age;//年龄
   char sex[5];//性别
   char id[20];//学号
}; //分号不能丢

2结构体变量的创建和初始化

#include <stdio.h>
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
int main()
{
//按照结构体成员的顺序初始化
struct Stu s = { "张三", 20, "男", "20230818001" };
printf("name: %s\n", s.name);
printf("age : %d\n", s.age);
printf("sex : %s\n", s.sex);
printf("id  : %s\n", s.id);
//按照指定的顺序初始化
struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex =
"⼥" };
printf("name: %s\n", s2.name);
printf("age : %d\n", s2.age);
printf("sex : %s\n", s2.sex);
printf("id  : %s\n", s2.id);
return 0;
}

3.结构体的特殊声明

在声明结构的时候,可以不完全的声明。
⽐如:

/匿名结构体类型
struct
{
  int a;
  char b;
  float c;
}x;

struct
{
  int a;
  char b;
  float c;
}a[20], *p;

上⾯的两个结构在声明的时候省略掉了结构体标签(tag)

//在上⾯代码的基础上,下⾯的代码合法吗?
p = &x;

警告:
编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。
匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。

4.结构体的自引用

在结构中包含⼀个类型为该结构本⾝的成员是否可以呢?
⽐如,定义⼀个链表的节点:

struct Node
{
  int data;
  struct Node next;
};

上述代码正确吗?如果正确,那 sizeof(struct Node) 是多少?
仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的⼤
⼩就会⽆穷的⼤,是不合理的。

正确的⾃引⽤⽅式:

struct Node
{
  int data;
  struct Node* next;
};

5.结构体传参

struct S
{
  int data[1000];
  int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
  printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
  printf("%d\n", ps->num);
}
int main()
{
  print1(s); //传结构体
  print2(&s); //传地址
  return 0;
}

上⾯的 print1 和 print2 函数哪个好些?
答案是:⾸选print2函数。

原因:
函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
如果传递⼀个结构体对象的时候,结构体过⼤,参数压栈的的系统开销⽐较⼤,所以会导致性能的下
降。
结论:
结构体传参的时候,要传结构体的地址。

标签:20,struct,自定义,int,char,printf,类型,结构
From: https://blog.csdn.net/2301_81288482/article/details/142055806

相关文章

  • 2、A+B(for循环,数据类型,sys模块)
    总结for循环foriteminlist:#循环体这里的list就是一个列表,而item是一个循环变量,表示每次循环时的值。persons=["Tom","Jerry","Vicky"]forpersoninpersons:print(person)除此之外,for循环遍历字符串。word='hello'forletterinword:print(letter)此外......
  • 关于在vue2中自定义右键弹窗
            所需变量//右键点击的弹框对象rightDialogbox:null,//鼠标点击后获取的文本chooseText:'',//弹窗的偏移left:'',top:'',//右键点击的弹框显隐rightDialogShow:false,一、阻止原生事件......
  • 2、A+B(关系运算符,数据类型转换)
    总结关系运算符在其他编程语言中,往往使用==两个等于号表示两个值相等,但是在js中,使用全等运算符===,运算符是关系运算符的一种,用于比较两个值之间是否相等,所以如果想要判定数组长度和1是否相等,可以使用arr.length===1其他关系运算符>:表示大于,比较左侧值是否大于右侧......
  • PyTorch自定义学习率调度器实现指南
    在深度学习训练过程中,学习率调度器扮演着至关重要的角色。这主要是因为在训练的不同阶段,模型的学习动态会发生显著变化。在训练初期,损失函数通常呈现剧烈波动,梯度值较大且不稳定。此阶段的主要目标是在优化空间中快速接近某个局部最小值。然而,过高的学习率可能导致模型跳过潜在的......
  • helm初始化自定义应用
    使用Helm初始化一个应用(即创建一个HelmChart),可以通过Helm提供的helmcreate命令生成一个基础的HelmChart目录结构。下面是具体步骤:1.安装Helm首先确保你的环境中已经安装了Helm。如果还没有安装,可以按照Helm官方文档进行安装:Helm安装文档2.初始化HelmCh......
  • Android连接蓝牙自定义封装SDK(基于Cordova与ionic)
    今天给大家分享一款基于Cordova与ionic框架自定义封装的Android手机连接蓝牙的插件。自己公司遇到的业务需求是,与第三方公司合作,需要在项目现场打印项目物资与物料验收单,后期提供给财务核对报销等。第三方公司提供蓝牙打印机与手持机,我们需要自己结合业务开发相对应的功能。......
  • OpenCV_自定义线性滤波(filter2D)应用详解
    OpenCVfilter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。卷积核本质上是一个固定大小的系数数组,数组中的某个元素被作为锚点(一般是数组的中心)。上面讲了线性滤波的实质就是计算相......
  • 数据结构:二叉树 (Heap堆篇) 手把手带你入门数据结构~ (简单易懂超详细~)
    文章目录前言一、树的概念1.树的概念与结构2.树的特性3.树的相关术语4.树的表示方法5.树形结构实际场景二、二叉树1.二叉树的概念2.二叉树的结构3.满二叉树3.完全二叉树1.完全二叉树的概念2.完全二叉树的性质3.完全二叉树的结构三、堆1.堆的概念2.堆的......
  • 数据结构:双向链表(Doubly Linked List篇)手把手带你入门数据结构~
    文章目录前言一、双向链表的概念1.结构特点:2.优点:二、双向链表的实现1.双向链表的结构2.双向链表初始化3.双向链表销毁4.双向链表打印5.双向链表尾插6.双向链表头插7.双向链表尾删8.双向链表头删9.双向链表查找10.双向链表指定位置插入11.双向链表指定位置......
  • vue自定义指令实现打字效果
    实现如通义灵码官网关于代码片段中,当鼠标hover上代码上时,出现打字效果,示例地址:https://tongyi.aliyun.com/lingma?spm=5176.28508143.J_ahRFo5CaAe_asSOaCgS4J.14.5421154auHz4xJ&scm=20140722.M_185502201.P_131.MO_2276-ID_10360025-MID_10360025-CID_31292-ST_10352-V_1通过vu......