当前位置: 首页 > news >正文

C语言学习之路--结构体篇

目录

  • 一、前言
  • 二、结构体的声明
    • 1、结构的基础知识
    • 2、结构的声明
    • 3、结构体成员的类型
    • 4、结构体变量的定义和初始化
  • 三、结构体成员的访问
  • 四、结构体传参

一、前言

  • 本人是一名小白,这一篇是记录我C语言学习中的结构体的所学所得,仅为简单的认识下C语言中的各个知识。

二、结构体的声明

1、结构的基础知识

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

2、结构的声明

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

例如描述一个学生:

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

3、结构体成员的类型

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

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

struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。struct Point p3 = { 1,2 };struct Stu//类型声明
{char name[15];//名字int age;//年龄
};struct Stu s = { "zhangsan", 20 };//初始化struct Node
{int data;struct Point p;struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

三、结构体成员的访问

  • 结构体变量访问成员
    结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
    例如:
    在这里插入图片描述
    我们可以看到 s 有成员 name 和 age ;
    那我们如何访问s的成员?
struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员
  • 结构体指针访问指向变量的成员
    有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针
    那该如何访问成员。
    如下:
#include <stdio.h>struct Stu
{char name[20];int age;
};void print(struct Stu* s)
{printf("name = %s,age = %d\n", (*s).name, (*s).age);printf("name = %s,age = %d\n", s->name, s->age);
}int main()
{struct Stu s = { "Lihua",20 };print(&s);return 0;
}

运行结果
在这里插入图片描述

四、结构体传参

struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);  //传结构体
print2(&s); //传地址
return 0;
}
  • 上面的 print1 和 print2 函数哪个好些?
    答案是:首选print2函数。
    原因:
  • 函数传参的时候,参数是需要压栈的。
    如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
    结论
    结构体传参的时候,要传结构体的地址.
http://www.lryc.cn/news/41615.html

相关文章:

  • 【LINUX】初识文件系统
  • 金三银四Java面试题及答案整理(2023最新版) 持续更新
  • 7个角度,用 ChatGPT 玩转机器学习
  • 关于多层板,你了解多少?
  • 使用sqlalchemy-gbasedbt连接GBase 8s数据库
  • 前端如何丢掉你的饭碗?
  • 栈、队列、优先级队列的模拟实现
  • JMM内存模型
  • Linux- 系统随你玩之--玩出花活的命令浏览器-双生姐妹花
  • 【深度学习】基于Hough变化的答题卡识别(Matlab代码实现)
  • Linux - 进程控制(创建和终止)
  • 依赖注入~
  • 【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程
  • Go语言异步下载视频
  • 前缀树(字典树/Trie) -----Java实现
  • ​申请专利需要具备什么条件
  • 【C++】一篇带你搞懂C++“引用”
  • 蓝桥杯刷题冲刺 | 倒计时19天
  • Java每日一练(20230321)
  • 【三维几何学习】从零开始网格上的深度学习-3:Transformer篇(Pytorch)
  • 一、基础算法3:二分 模板题+算法模板(数的范围,数的三次方根)
  • Spring 源码解析 - Bean创建过程 以及 解决循环依赖
  • 移除元素(双指针)
  • 76.qt qml-QianWindow开源炫酷界面框架(支持白色暗黑渐变自定义控件均以适配)
  • Python生日蛋糕
  • QT 如何提高 Qt Creator 的编译速度
  • STM32之震动传感器、继电器介绍及实战
  • RK3588平台开发系列讲解(显示篇)RK3588 平台 的DP介绍
  • 【Java】i++和++i的实现原理
  • 第十四届蓝桥杯三月真题刷题训练——第 18 天