结构体详解+剖析

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

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


结构体类型的声明


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


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


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


所以最后结论:

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

相关文章
|
11月前
【结构体】
【结构体】
27 0
|
11月前
|
存储 C语言
C 结构体
C 结构体。
30 0
|
4月前
|
存储 算法 数据安全/隐私保护
结构体
结构体
47 1
|
3月前
初识结构体
初识结构体
39 5
|
3月前
|
存储 算法 C++
C++结构体
C++结构体
|
4月前
|
编译器 Linux C语言
结构体(详解)
结构体(详解)
49 1
|
4月前
|
算法 C语言
结构体相关知识
结构体相关知识
|
编译器 C++
C#视频-结构体
C#视频-结构体
52 0
|
存储 C++