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

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; //声明类型的同时定义变量p1

struct 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.kler.cn/a/2211.html

相关文章:

  • Java算法OJ(7)随机快速排序
  • Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版
  • 408模拟卷较难题(无分类)
  • 陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解
  • Microsoft 365 Exchange如何设置可信发件IP白名单
  • 时序数据库TimescaleDB安装部署以及常见使用
  • [JS] JS小技巧
  • Python3,5行代码,生成自动排序动图,这操作不比Excel香?
  • Three.js——learn01
  • 什么是语法糖?Java中有哪些语法糖?
  • FPGA基于RIFFA实现PCIE采集HDMI传输,提供工程源码和QT上位机
  • C语言学习之路--指针篇
  • Linux文本三剑客(grep、sed、awk)
  • 雅克比矩阵学习笔记
  • 算法基础---基础算法
  • Learning C++ No.18【STL No.8】
  • 线段树SegmentTree
  • 为什么 ChatGPT 输出时经常会中断,需要输入“继续” 才可以继续输出?
  • 面试了8家软件公司测试岗位,面试题大盘点,我真的尽力了
  • 用结构体实现通讯录
  • Springboot源代码总结
  • Maven
  • Unity --- 游戏案例 --- 英雄无敌与Ruby
  • 第十九天 Maven总结
  • Python爬虫——Python Selenium基本用法
  • 字典树(前缀树)