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

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

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

结论:

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

相关文章
【结构体】
【结构体】
28 0
|
6月前
|
存储 算法 数据安全/隐私保护
结构体
结构体
58 1
|
5月前
初识结构体
初识结构体
42 5
|
5月前
|
编译器 Linux C语言
浅谈结构体
浅谈结构体
39 1
|
6月前
|
存储 算法 C语言
c结构体
c结构体
33 1
|
6月前
|
存储 安全 编译器
一篇文章介绍结构体
一篇文章介绍结构体
51 1
|
6月前
|
算法 C语言
结构体相关知识
结构体相关知识
|
12月前
|
机器学习/深度学习 存储 编译器
Day_16 结构体
Day_16 结构体
|
6月前
|
Java 编译器 Linux
再次认识结构体
再次认识结构体
68 0
C—结构体
C语言学习第十四弹