s7——结构体

简介: s7——结构体

1、结构体类型的声明

1.1 结构的基础知识

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

1.2  结构的声明


例如描写一个学生:

//描述一个学生
struct stu
{
  //结构体成员
  char name[20];//名字
  int age;
  char sex[10];//性别
  float score;
};//注意;不能丢

1.3  结构成员的类型

结构的成员可以是变量、数组、指针,甚至是其他结构体。

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

有了结构体类型,怎么定义变量呢?

类比内置类型:int float……

代码实例:

定义变量:通过类型创造变量

//描述一个学生
struct stu
{
  //结构体成员
  char name[20];//名字
  int age;
  char sex[10];//性别
  float score;
} s3;//s3是结构体变量——全局的(声明类型的同时定义变量)
struct stu s4;//s4是结构体变量——全局的
int main()
{
  struct stu s1, s2;//s1,s2也是结构体变量——局部的
  return 0;
}

初始化:定义变量的同时赋初值

//初始化:定义变量的同时赋初值
struct stu
{
  //结构体成员
  char name[20];//名字
  int age;
  char sex[10];//性别
  float score;
};
int main()
{
  struct stu s1 = { "张三", 19, "男" ,65.5f };
  return 0;
}

补充:结构体嵌套初始化

//结构体1
struct S
{
  int a;
  char ch;
};
//结构体2
struct P
{
  double d;
  struct S s;//结构体嵌套
  float f;
};
#include<stdio.h>
int main()
{
  struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化
  //打印p结构体1中的内容
  printf("%d %c\n", p.s.a, p.s.ch);
  return 0;
}

2、结构体成员的访问

       ①结构体变量访问成员:结构体变量.成员名(.操作符)

       ②结构体指针访问指向变量成员:结构体指针->成员名(->操作符)

代码实例:

//2、结构体成员的访问
// . 结构体变量.成员名
// -> 结构体指针->成员名
//结构体1
struct S
{
  int a;
  char ch;
};
//结构体2
struct P
{
  double d;
  struct S s;//结构体嵌套
  float f;
};
#include<stdio.h>
void print1(struct P sp)
{
  //结构体变量.成员名
  printf("%.2lf %d %c %.2f\n", sp.d, sp.s.a, sp.s.ch, sp.f);
}
void print2(struct P* sp)
{
  printf("%.2lf %d %c %.2f\n", (*sp).d, (*sp).s.a, (*sp).s.ch, (*sp).f);
  //结构体指针->成员名
  printf("%.2lf %d %c %.2f\n", sp->d, sp->s.a, sp->s.ch, sp->f);
}
int main()
{
  struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化
  print1(p);//传值调用
  print2(&p);//传址调用
  return 0;
}

3、结构体传参

代码实例:

//2、结构体成员的访问
// . 结构体变量.成员名
// -> 结构体指针->成员名
//结构体1
struct S
{
  int a;
  char ch;
};
//结构体2
struct P
{
  double d;
  struct S s;//结构体嵌套
  float f;
};
#include<stdio.h>
void print1(struct P sp)
{
  //结构体变量.成员名
  printf("%.2lf %d %c %.2f\n", sp.d, sp.s.a, sp.s.ch, sp.f);
}
void print2(struct P* sp)
{
  printf("%.2lf %d %c %.2f\n", (*sp).d, (*sp).s.a, (*sp).s.ch, (*sp).f);
  //结构体指针->成员名
  printf("%.2lf %d %c %.2f\n", sp->d, sp->s.a, sp->s.ch, sp->f);
}
int main()
{
  struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化
  print1(p);//传值调用
  print2(&p);//传址调用
  return 0;
}

上面的print1和print2函数哪个好些呢?

答案是:首选print2函数

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

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

结论:

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

相关文章
|
自然语言处理 数据可视化 算法
第5章 数据可视化——5.4 四维图形可视化
第5章 数据可视化——5.4 四维图形可视化
|
XML Java 数据格式
如果Spring中有两个ID相同的Bean,会报错吗?
有位粉丝被 问到这样一个问题,说在Spring中,如果有两个ID相同的Bean,会不会报错?如果报错,会在哪个阶段报错? 这个问题也要分析具体的情况,才能完整的回答。我从三个方面来回答你的问题吧。
550 0
|
小程序 Windows
uniapp运行微信小程序routeDone的错误问题
uniapp运行微信小程序routeDone的错误问题
2777 0
|
10月前
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
478 5
|
Java Shell Linux
RPM包管理器的JDK
【7月更文挑战第16天】
185 2
|
JavaScript Java 开发工具
最新!海康威视 java B/S SDK 强势登场
最新!海康威视 java B/S SDK 强势登场
642 0
最新!海康威视 java B/S SDK 强势登场
|
Java Maven
使用Java合并PDF文档
使用Java合并PDF文档
477 0
|
存储 机器学习/深度学习 安全
Linux加强篇007-使用RAID与LVM磁盘阵列技术
山重水复疑无路,柳暗花明又一村
605 0
Linux加强篇007-使用RAID与LVM磁盘阵列技术
|
Java 编译器 C++
重温经典《Thinking in java》第四版之第九章 接口(四十六)
重温经典《Thinking in java》第四版之第九章 接口(四十六)
75 0
|
算法 开发工具 计算机视觉
使用 YOLOv5 进行图像分割的实操案例
使用 YOLOv5 进行图像分割的实操案例