C语言之结构体详解

发布于:2024-04-19 ⋅ 阅读:(29) ⋅ 点赞:(0)

结构体重点:

🚀1、结构体类型的声明

🚀2、结构体初始化

🚀3、结构体成员访问

🚀4、结构体传参

一、结构体类型的声明

结构的基础知识

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

结构的声明

//比如描述学生,学生包含:名字+年龄+性别+学号
 Struct Stu
{
  char name[20];
  int age;
  char sex[5];
  char id[15];
};
//特别注意:最后的分号不能丢

Struct——>结构体关键字  Stu——>结构体标签  Struct Stu——>结构体类型 

#include<stdio.h>
Struct Stu
{
  char name[20];
  int age;
  char sex[5];
  char id[15];
};//相当于定义出了一个结构体类型
int main()
{
  Struct Stu s;//创建结构体变量
  return 0;
}

#include<stdio.h>
Struct Stu
{
  char name[20];
  int age;
  char sex[5];
  char id[15];
};s1,s2,s3//s1,s2,s3是三个局部变量(不到万不得已的情况下尽量不要去写变量列表,少用局部变量)
//写法二:
//typedef Struct Stu
//{
 //char name[20];
  //int age;
  //char sex[5];
  //char id[15];
//}Stu;
int main()
{
  Struct Stu s1;//局部变量
  //Stu s2;
  return 0;
}

结构体成员的类型 

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

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

有了结构体如何定义变量?

Struct Point
{
  int x;
  int y;
}p1;//声明变量的同时定义变量p1
Struct Piont p2;//定义结构体变量p2



//初始化:定义变量的同时赋予初值
Struct Piont p3={x,y};

结构体的初始化:

typedef Struct Stu
{
  char name[20];
  int age;
  char sex[5];
  char id[15];
}Stu;
int main()
{
  Stu s={"张三",20,"男","20090219423"};
  return 0;
}

结构体包含结构体: 

Struct S
{
  int a;
  char c;
  char arr[20];
  double d;
};
Struct T
{
  char ch[10];
  Struct S s;
  char* pc;
};
//初始化
int main() 
{
  Struct T t={"hehe",{100,'w',"hello world",3.14},NULL};
  printf("%s\n",t.ch);
  printf("%s\n",t.s.c);
  return 0;
}

三、结构体成员的访问

结构体变量访问成员,结构变量的成员是通过操作符(.)访问的。点操作符接受两个操作数,比如:

struct Stu
{
  char name[20];
  int age;
};
struct Stu s;

我们可以看到s有name和age;那我们如何访问s的成员?

srtuct Stu s;
strcpy(s.name,"zhangsan");//使用.访问name成员
s.age=20;//使用.访问age成员

结构体指针访问指向变量的成员,有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。那该如何访问成员。如下:

struct Stu
{
  char name[20];
  int age;
};
void print(struct Stu* ps)
{
  printf("name=%s age=%d\n",(*ps).name,(*ps).age);//使用结构体指针访问指向对象的成员
  printf("name=%s age=%d\n",ps->name,ps->age);
}
int main()
{
  struct Stu s={"张三",20};
  print(&s);//结构体地址传参
  return 0;
}

ed40b0ca3d4f46d88603c066b2491590.png  显然print2要比print好上一些,这是因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。(通俗的理解,就是print1传参需要开辟和形参一模一样的数据大小空间浪费很大,而print2只是把地址传过去了仅仅需要开辟8个字节)

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

压栈是什么意思?

09f9bbaebb9c42bebf3d523816e46aed.png

以此为例: 

int Add(int x,int y)
{
  int z=0;
  z=x+y;
  return z;
}
int main()
{
  int a=10;
  int b=20;
  int ret=0;
  ret=Add(a,b);
  return 0;
}

d43cb93a36ee4f93aad91e85e6ee8316.png

补充一些数据结构内容:

先行数据结构:

顺序表

链表

栈:先进后出,后进先出;插入一个元素称为压栈,删除一个元素叫做出栈

队列:先进先出,后进后出

树形数据结构:

二叉树 

结语:

总的来说,结构体的意义在于它提供了一种有效的方式来组织和表示复杂的数据,使得数据的处理变得更加方便和高效。