C语言结构体详解

简介: 目录1. 结构体类型的声明2. 结构体初始化3. 结构体成员访问4. 结构体传参

1. 结构体类型的声明

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


生活中的对象都是复杂的!


人:名字+性别+年龄+电话+……


书:书名+作者+出版社+定价……


结构体就是用来描述复杂对象的


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


基本格式:

struct tag
{
    member-list;
}variable-list;

例如描述一个学生:

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

再例如:

#include<stdio.h>
struct stu
{
  char name[20];
  int age;
  float score;
}s1,s2;  // s1,s2是两个结构体变量,全局的
int main()
{
  int a = 0;
  int b = 0;
  struct stu s;  // 定义一个结构体变量,局部的
  return 0;
}

2. 结构体初始化

直接看代码:

#include<stdio.h>
struct s
{
  int a;
  char c;
  double d;
};
struct stu
{
  struct s ss;
  char name[20];
  int age;
  float score;
}s1, s2;  // s1,s2是两个结构体变量,全局的
int main()
{
  int a = 0;
  int b = 0;
  struct stu s = { {30,'w',123.55},"zhangsan",20,97.5f};  // 定义一个结构体变量,局部的
  printf("%d %c %lf\n%s %d %f\n", s.ss.a, s.ss.c, s.ss.d, s.name, s.age, s.score);
  return 0;
}

image.png

3. 结构体成员访问

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

例如:image.png

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

image.png

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

如下:

#include<stdio.h>
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 = { "zhangsan", 20 };
    print(&s);//结构体地址传参
    return 0;
}

image.png

4. 结构体传参

传值调用

#include<stdio.h>
struct S
{
  int age;
  char name[20];
  int arr[1000];
  double score;
};
void print(struct S s)
{
  printf("%d\n", s.age);
  printf("%s\n", s.name);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", s.arr[i]);
  }
  printf("\n");
  printf("%lf\n", s.score);
}
int main()
{
  struct S s = { 20,"zhen yu",{1,2,3,4,5,6,7,8,9,10},3.14 };
  print(s);
  return 0;
}

image.png传址调用, 效果更好

#include<stdio.h>
struct S
{
  int age;
  char name[20];
  int arr[1000];
  double score;
};
void print2(struct S *ps)
{
  printf("%d\n", ps->age);
  printf("%s\n", ps->name);
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%d ", ps->arr[i]);
  }
  printf("\n");
  printf("%lf\n", ps->score);
}
int main()
{
  struct S s = { 20,"zhen yu",{1,2,3,4,5,6,7,8,9,10},3.14 };
  print2(&s);
  return 0;
}

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

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

相关文章
|
6天前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
26 7
|
4天前
|
网络协议 编译器 Linux
结构体(C语言)
结构体(C语言)
|
16天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
30 7
|
16天前
|
编译器 C语言
【C语言基础】:自定义类型(一)--> 结构体-2
【C语言基础】:自定义类型(一)--> 结构体
|
16天前
|
编译器 Linux C语言
【C语言基础】:自定义类型(一)--> 结构体-1
【C语言基础】:自定义类型(一)--> 结构体
|
24天前
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
21 3
|
24天前
|
存储 编译器 C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
24 2
|
24天前
|
编译器 Linux C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
23 1
|
3天前
|
C语言
C语言中的结构体
C语言中的结构体
4 0
|
25天前
|
编译器 C语言
C语言深度理解之——结构体内存对齐
C语言深度理解之——结构体内存对齐
19 1