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

熟悉c语言结构体

熟悉c语言结构体

  • 一. 结构体的声明
    • 1. 基础知识
    • 1.2 结构体的声明
    • 1.3 结构成员的类型
    • 1.4 结构体变量的定义和初始化
  • 二. 结构体成员的访问
    • 1. 结构体变量访问成员
    • 2. 结构体指针访问成员的变量
  • 三. 结构体传参

一. 结构体的声明

1. 基础知识

为什么会有结构体呢 有了int float这些类型的变量不就够了嘛?

我们说 要描述一个复杂对象的时候 光靠简单的int 和float是不能够准确描述的

例如学生 他要有名字 要有学号等等

1.2 结构体的声明

我们规定 结构体声明要满足以下格式

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

例如 我们使用结构体来描述一个学生

struct stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}stu;//分号不能丢
//实际上上面一行的stu是一个全局变量  我们在使用结构体创建变量的时候一般要使用局部变量

1.3 结构成员的类型

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

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

struct Point
{
	int x;
	int y;
}p1;

struct Point p2; //定义结构体变量p2

// 初始化 定义变量的同时赋值 
struct Point p3 = { 2,3 };

定义初始化的三种方式

p1 p2 p3

struct Point
{
	int x;
	int y;
}p1;

struct Point p2; //定义结构体变量p2

// 初始化 定义变量的同时赋值 
struct Point p3 = { 2,3 };

struct Node
{
	int date;//整形
	struct Point p;//结构体类型
	struct Node* next;//指针类型
};

struct Node n1 ={2,{2,3},NULL };

放置结构体中的三种类型

二. 结构体成员的访问

1. 结构体变量访问成员

结构变量成员是通过点操作符来访问的。

点操作符接受两个操作数。 例如 :

struct stu
{
	char name[20];
	int age;
};

struct stu s1={"xiaomengxin",18 };

int main()
{
	s1.age = 20;//使用.访问age

}

那么同学们思考一下可不可以使用上面的操作来修改name呢?

答案是不可以

因为s1.name其实访问的是name这个数组的地址 地址是不能被修改的

那么我们要怎么修改呢 ?

还记不记得我们之前学过一个函数

strcpy()

struct stu
{
	char name[20];
	int age;
};

struct stu s1={"xiaomengxin",18 };

int main()
{
	s1.age = 20;//使用.访问age
	strcpy(s1.name, "9527");
}

这样子就可以啦

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

	struct stu* p = &s1;
	(*p).age;
	(*p).name;
	p->age;
	p->name;

和结构体变量差不多

要注意的是多了一个可以用指针变量指向结构体成员的方法

三. 结构体传参


struct S
{
	int date[1000];
	int num;
};

struct S s1 = { {1,2,3,4} ,5 };

void print1(struct S s1)
{
	printf("%d\n", s1.num);
}


void print2(struct S* p1)
{
	printf("%d\n", p1->num);
}


int main()
{
	print1(s1);
	print2(&s1);
	return 0;
}

上面的代码就能很好的说明问题

两种传参方式

传值调用和传址调用

我们这里推荐使用传址调用 至于原因呢 大家可以参考我写的这两篇博客

函数栈帧上

函数栈帧下

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯

相关文章:

  • uboot源码分析(基于S5PV210)之启动第二阶段
  • 【分布式】分布式系统、Redis中间件 、Cache穿透、击穿、雪崩
  • Rust基础语法
  • 电子知识学习网站
  • 全站最简单 “数据滚动可视化大屏” 【JS基础拿来即用】
  • Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(开发导航栏及公共部分)
  • ScalableViT网络模型
  • Nginx配置流数据转发指导
  • 【单细胞高级绘图】10.KEGG富集结果的圆圈图
  • 怎样在应用中实现自助报表功能?
  • 生成指定位数的随机验证码
  • 线性布局和相对布局
  • 高级数据结构——红黑树
  • Python语言学习:Python语言学习之数据类型/变量/字符串/操作符/转义符的简介、案例应用之详细攻略
  • CentOS下安装及配置MySQL
  • extract-text-webpack-plugin用法
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java-详解HashMap
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • mysql_config not found
  • scala基础语法(二)
  • vuex 学习笔记 01
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 给第三方使用接口的 URL 签名实现
  • 近期前端发展计划
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端攻城师
  • 如何使用 JavaScript 解析 URL
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 提醒我喝水chrome插件开发指南
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 移动端解决方案学习记录
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​什么是bug?bug的源头在哪里?
  • #NOIP 2014# day.2 T2 寻找道路
  • #微信小程序:微信小程序常见的配置传旨
  • $NOIp2018$劝退记
  • $refs 、$nextTic、动态组件、name的使用
  • (HAL库版)freeRTOS移植STMF103
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (九)c52学习之旅-定时器
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一) storm的集群安装与配置
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .net 按比例显示图片的缩略图
  • .NET 反射 Reflect
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET6 开发一个检查某些状态持续多长时间的类