结构体详解+剖析

简介: 结构体成员可以是标量,数组,指针,甚至是其他结构体。

----------------------结构体详解+剖析--------------------------------


结构体类型的声明


1.结构体的声明


1.1结构体的基础知识


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


1.2结构体的声明


>` struct sth(随便写,最好有意义)
> {
>    member(成员)--list(列表)
> }variable-list;(创建一个结构体变量)
`


例如描述一个学生:


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


1.3结构体成员的类型


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


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


有了结构体的类型,那如何定义变量呢?


struct Point
{
  int x;
  int y;//声明结构成员变量类型
}p1;//同时又定义变量p1;
struct Point p2//定义结构体变量p2
  struct Point p3 = { x,y };  //初始化:定义变量的同时赋初始值。


结构体初始化


struct Stu//           结构体类型声明
{
  char name[15];//名字
  int age;//年龄
};
struct Stu s = { "zhangsan",20 };//初始化


struct Point
  {
    int x;
    int y;//声明结构成员变量类型
  }p1;//同时又定义变量p1;
struct Node
{
  int date;
  struct Point p;
  struct Node* next;
}n1={10,{4,5},NULL};             //结构体嵌套初始化
struct Node n2 = { 20,{5,6},NULL };//结构体嵌套初始化。


结构体成员的访问


1.结构体变量访问成员


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


例如13b23cbc0eb04302918805c19f62c6e1.png


我们可以看到结构体s有成员name和age;


那我们如何访问s的成员呢?


struct Stu//           结构体类型声明
{
  char name[15];//名字
  int age;//年龄
};
struct Stu s = { "zhangsan",20 };//初始化
int main()
{
  struct S s;
  strcpy(s.name, "zhangsan");//使用.访问name成员’
  s.age = 20;//使用.访问age成员
  return 0;
}


2.结构体指针访问指向变量的成员


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


那该如何访问成员呢?


struct Stu
{
  char name[10];
  int age;
};
void print(struct Stu* ps)//print函数接收结构体地址,定义为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 = { "zhangsan",20 };
  print(&s);//结构体地址传参,把结构体s的地址传过去
  return 0;
}


        ->(变量地址)可以直接进行访问地址,.操作符还要解引用操作符才能访问地址


结构体传参


struct Stu
{
  int id[1000];//构建结构体
  int age;
};
struct Stu s = { {220503430},20 };//结构体初始化
//结构体传参
void print1(struct Stu s)
{
  printf("%d\n", s.age);
}
//结构体地址传参
void print2(struct Stu* ps)
{
  printf("%d\n", (*ps).age);
  printf("%d\n", ps->age);
}
int main()
{
  print1(s);//传结构体
  print2(&s);//传结构体地址
  return 0;
}


print1和print2函数都能实现对结构体的访问,哪个更好一些呢?


答案是print2函数


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


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


所以最后结论:

结构体在传参时,最好传结构体的地址!

相关文章
|
编译器 C语言 C++
【C语言】malloc()函数详解(动态内存开辟函数)
【C语言】malloc()函数详解(动态内存开辟函数)
2948 2
|
程序员 编译器 C语言
C语言库函数 — 错误信息报告函数
C语言库函数 — 错误信息报告函数
244 0
|
SQL 存储 关系型数据库
关系型数据库SQLserver添加新列
【8月更文挑战第4天】
417 9
|
Python
Python应用中名称错误(NameError)
【5月更文挑战第16天】
1169 2
|
SQL 数据挖掘 大数据
如何在 SQL Server 中使用 `OFFSET` 和 `FETCH`
【8月更文挑战第10天】
2906 8
|
算法 图形学 C++
[EasyX库安装介绍讲解】超详细入门级
[EasyX库安装介绍讲解】超详细入门级
832 1
|
16小时前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
10天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~