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

结构体大揭秘:代码中的时尚之选(上)

目录

  • 结构
  • 结构的声明
  • 结构成员的类型
  • 结构体变量的定义和初始化
  • 结构体成员的访问
  • 结构体传参

结构

结构是一些值的集合,这些值被称为成员变量。之前说过数组是相同类型元素的集合。结构的每个成员可以是不同类型的变量,当然也可以是相同类型的。

我们在生活中会用姓名、性别、年龄、身份证号来描述人,用书名、作者、出版社、书号等等来描述书。像这些复杂的对象就需要用结构体来描述。

结构的声明

struct 名称
{成员列表(一个或者多个);
}变量列表;

比如我们用结构体来描述一个学生,假设需要用到姓名,性别和年龄。

#include<stdio.h>struct Stu
{//成员变量,描述结构体对象的相关属性char name[20];char sex[5];int age;
};int main()
{//int a;struct Stu a; //struct Stu是类型return 0;
}

在这里插入图片描述

struct Stu
{//成员变量,描述结构体对象的相关属性char name[20];char sex[5];int age;
}a,b,c; //这里的a,b,c是结构体变量,属于全局变量
typedef struct Stu
{//成员变量,描述结构体对象的相关属性char name[20];char sex[5];int age;
}Stu; //这里的Stu相当于把struct Stu重命名为Stu int main()
{//struct Stu a;Stu a; //struct Stu是类型。现在由Stu替代。没有typedef,struct不能省略。return 0;
}

结构成员的类型

结构成员可以是标量、数组、指针或者其他结构体。

struct A 
{int a; char arr[10]; //数组int* p; //指针
};struct B
{int b;struct A b; //其他结构体
};

结构体变量的定义和初始化

//定义
//第一种方法
struct A
{int x;int y;
}a1; //定义a1//第二种方法
struct A a2; //定义结构体变量a2
//初始化1
struct A a3 = {3,5};//定义变量的同时初始化。
//初始化2
struct A
{int x;int y;
}a4 = {3,5};

结构体成员的访问

通过点操作符访问

//1
#include<stdio.h>struct A
{int x;int y;
}a4 = {3,5};int main()
{printf("%d %d\n", a4.x, a4.y);return 0;
}
//2
#include<stdio.h>struct Stu
{char name[10];char sex[5];int age;
};int main()
{struct Stu a = { "小刘","男",19};printf("%s %s %d\n", a.name, a.sex, a.age);return 0;
}

有时候我们得到的不是结构体变量,而是一个指向结构体的指针

#include<stdio.h>
struct Stu
{char name[10];char sex[5];int age;
};void Out(struct Stu* pa)
{printf("%s %s %d\n", (*pa).name, (*pa).sex, (*pa).age);printf("%s %s %d\n", pa->name, pa->sex, pa->age);//使用结构体指针访问指向对象的成员
}
int main()
{struct Stu a = { "小刘", "男", 19 };Out(&a);return 0;
}

结构体传参

#include<stdio.h>struct A
{int arr[100];int num;
}a = { {1,2,3} , 5};//结构体传参
void Out1(struct A a)
{printf("%d\n", a.num);
}//结构体地址传参
void Out2(struct A* pa)
{printf("%d\n", pa->num);
}int main()
{Out1(a); //方法1Out2(&a); //方法2return 0;
}

首选方法2
原因:函数传参的时候,参数是需要压栈的。如果传递的结构体对象的时候,结构体太大的话,参数压栈的系统开销会比较大,很浪费内存,会导致性能下降。
所以结构体传参的时候,要传结构体的地址

http://www.lryc.cn/news/285212.html

相关文章:

  • 【unity学习笔记】语音驱动blendershape
  • docker常用基础命令
  • 自动驾驶中的坐标系
  • js数组的截取和合并
  • 2024美赛数学建模思路 - 案例:感知机原理剖析及实现
  • 大中台,小前台:打造快速响应市场的企业竞争力
  • SpringCloud Alibaba 深入源码 - Nacos 和 Eureka 的区别(健康检测、服务的拉取和订阅)
  • Java复习_3
  • 分类预测 | Matlab实现KPCA-EBWO-SVM分类预测,基于核主成分分析和改进的白鲸优化算法优化支持向量机分类预测
  • 力扣hot100 找到字符串中所有字母异位词 滑动窗口 双指针 一题双解
  • PG DBA培训21:PostgreSQL性能优化之基准测试
  • 使用excel从1-2048中随机选择1个整数,并展示与其对应的单词
  • c++可调用对象、function类模板与std::bind
  • 【高危】Apache Solr 环境变量信息泄漏漏洞
  • Python中的卷积神经网络(CNN)入门
  • vulnhub靶机HotelWW
  • ArcGIS Pro 标注牵引线问题
  • Java8的Stream最佳实践
  • Spark SQL函数定义
  • 触摸屏监控双速电动机-PLC I/O电路设计
  • idea中使用git提交代码报 Nothing To commit No changes detected
  • 基于长短期神经网络的回归分析,基于LSTM的回归预测
  • mac查看maven版本报错:The JAVA_HOME environment variable is not defined correctly
  • 蓝桥杯省赛无忧 编程9
  • Spring data都包含哪些内容
  • unity 利用Graphics.Blit来制作图片效果
  • Linux ---- 小玩具
  • 练习题 有奖问答
  • php 文件操作
  • Next-GPT: Any-to-Any Multimodal LLM