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

C语言结构体讲解

目录

结构体的声明

结构的基础知识

结构的声明

为什么要出现结构体?

结构成员的类型

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

定义:(全局变量//局部变量)

 初始化:

结构体成员的访问

结构体传参


结构体的声明

结构的基础知识

结构(结构体)

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

数组:一组 相同类型 元素的集合

结构的声明

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

member-list ——成员变量的列表
variable-list ——变量列表 

为什么要出现结构体?

首先,结构体允许我们将不同类型的数据组合在一起,形成一个自定义的数据类型。这对于表示和操作复杂的数据结构非常有用,例如在图形学、数据库和网络编程中。

其次,结构体提供了一种将相关的数据和功能组织在一起的方式,以便更好地管理和访问这些数据。通过将相关的数据放在一起,我们可以更容易地维护和操作它们,同时也可以提高代码的可读性和可维护性。

此外,结构体还可以用于创建自定义的数据类型,以便更好地表示现实世界中的对象或概念。例如,我们可以使用结构体来表示一个学生 (复杂对象)人:名字+性别+年龄+电话+地址+

描述一个学生:

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

"typedef" 是 C++ 编程语言中的一个关键字,它可以用来为已经存在的数据类型定义一个新的名称。这样做可以使程序更加易读易懂,也可以简化程序中的代码。示例代码如下:

typedef int myInt; // 将 int 定义为 myInt
myInt a = 10; // 等价于 int a = 10;

这样,我们就可以使用 myInt 来代替 int,从而使代码更简洁易读。

 Stu 是重命名产生的新的类型

结构成员的类型

在 C++ 编程语言中,结构体(struct)是一种用户自定义的数据类型,可以包含多个不同类型的成员变量。下面是一些常见的结构体成员类型示例:

整数类型:

struct Person {int age;// ...
};

浮点数类型:

struct Circle {float radius;// ...
};

字符类型:

struct Student {char name[20];// ...
};

字符串类型(使用字符数组)

struct Book {char title[50];// ...
};

枚举类型:

enum Gender { Male, Female };struct Employee {Gender gender;// ...
};

自定义结构体类型:

struct Point {int x;int y;
};struct Rectangle {Point topLeft;
};

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

定义:(全局变量//局部变量)

 初始化:

定义变量的同时赋初值

//按照顺序初始化:

//指定成员来初始化:

结构体成员的访问

结构变量的成员是通过点操作符(.)访问的。

点操作符接受两个操作数。

例如:

错误写法:

实参传递给形参的时候,形参是实参的一份临时拷贝,对形参的修改不会影响实参 

正确写法:

 注:结构体的指针可以直接用->指向成员名

结构体传参

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函数。

原因:

函数传参的时候,参数是需要压栈的。

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

结论:

结构体传参的时候,要传结构体的地址。

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

相关文章:

  • 021 - STM32学习笔记 - Fatfs文件系统(三) - 细化与总结
  • jQuery如何获取动态添加的元素
  • Keepalived 在CentOS 7安装并配置监听MySQL双主
  • 深度学习,神经网络介绍
  • 中国AI大模型峰会“封神之作”!开发者不容错过这场夏季盛会
  • Android Studio多渠道打包
  • RK3566 Android11默认客户Launcher修改
  • ORB算法在opencv中实现方法
  • vue项目回显文本无法识别换行符
  • Minio 部署
  • Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法
  • Ansible部署MariaDB galera集群(多主)
  • 立体库-库龄
  • extern/头文件包含,实现一个函数被两个文件共用
  • pgsql 查看某个表建立了那些索引sql
  • 【SCSS】网格布局中的动画
  • Docker基础命令(一)
  • django4.2 day1Django快速入门
  • linux的exec和system函数介绍及选择
  • 150行代码写一个Qt井字棋游戏
  • k8s概念-controller
  • Gis入门,根据起止点和一个控制点计算二阶贝塞尔曲线(共三个控制点组成的线段转曲线)
  • 第1集丨Vue 江湖 —— Hello Vue
  • PCB制版技术
  • 大数据课程E7——Flume的Interceptor
  • P2P网络NAT穿透原理(打洞方案)
  • Gof23设计模式之桥接外观模式
  • 微服务性能分析工具 Pyroscope 初体验
  • 工作记录------单元测试(持续更新)
  • C#再windowForm窗体中绘画扇形并给其填充颜色