初识结构体

文章目录

  • 目录
    • 1. 结构体类型的声明
      • 1.1 结构的基础知识
      • 1.2 结构的声明
      • 1.3 结构成员的类型
      • 1.4 结构体变量的定义和初始化
    • 2. 结构体成员的访问
    • 3. 结构体传参

目录

  • 结构体类型的声明
  • 结构体初始化
  • 结构体成员访问
  • 结构体传参

1. 结构体类型的声明

1.1 结构的基础知识

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

注:

数组: 一组相同类型元素的集合

结构体: 其实是一组不一定相同类型元素的集合

1.2 结构的声明

结构的声明

//描述一个学生
//名字+年龄+性别

//声明结构体类型
struct Stu
{
	//成员变量,是用来描述结构体对象的相关属性的
	char name[20];
	int age;
	char sex[5];//男 女 保密
}s2, s3, s4;//s2,s3,s4 就是结构体变量 - 全局变量

typedef struct Stu
{
	//成员变量,是用来描述结构体对象的相关属性的
	char name[20];
	int age;
	char sex[5];//男 女 保密
}Stu;

int main()
{
	//int a = 10;
	struct Stu s1;//局部变量
	Stu s2;
	
	return 0;
}

注:

struct Stu
{
	//成员变量,是用来描述结构体对象的相关属性的
	char name[20];
	int age;
	char sex[5];//男 女 保密
};

int main()
{
	//int a = 10;
	struct Stu s1;//局部变量
	//Stu s2;//在C语言中,没有对结构体类型typedef,struct关键字不能省略

	return 0;
}

1.3 结构成员的类型

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

struct S
{
	int a;
	char arr[5];
	int* p;
};

struct B
{
	char ch[10];
	struct S s;
	double d;
};

int main()
{

	return 0;
}

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

struct S
{
	int a;
	char arr[5];
	int* p;
}s1 = {100, "bit", NULL};

struct S s2 = {98, "hehe", NULL};

struct B
{
	char ch[10];
	struct S s;
	double d;
};

int main()
{
	struct S s3 = {.arr = "abc", .p = NULL, .a = 1};
	struct B sb = { "hello", {20, "qqq", NULL}, 3.14 };

	return 0;
}

2. 结构体成员的访问

  1. 结构体变量访问成员
#include <stdio.h>

struct S
{
	int a;
	char arr[5];
	int* p;
}s1 = {100, "bit", NULL};

struct S s2 = {98, "hehe", NULL};

struct B
{
	char ch[10];
	struct S s;
	double d;
};

int main()
{
	struct S s3 = {.arr = "abc", .p = NULL, .a = 1};
	printf("%d %s %p\n", s3.a, s3.arr, s3.p);//. 结构成员访问操作符
	struct B sb = { "hello", {20, "qqq", NULL}, 3.14 };
	printf("%s %d %s %p %.2lf\n", sb.ch, sb.s.a, sb.s.arr, sb.s.p, sb.d);

	return 0;
}
  1. 结构体指针访问指向变量的成员

以下代码是有问题的:

#include <string.h>

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

void set_Stu(struct Stu t)
{
	t.age = 20;
	//t.name = "张三";//err
	strcpy(t.name, "张三");//字符串拷贝
}

void print_Stu(struct Stu t)
{
	printf("%s %d\n", t.name, t.age);
}

int main()
{
	struct Stu s = { 0 };
	set_Stu(s);
	print_Stu(s);

	return 0;
}

正确代码:

#include <string.h>

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

//void set_Stu(struct Stu* ps)
//{
//	(*ps).age = 20;
//	strcpy((*ps).name, "张三");//字符串拷贝
//}

void set_Stu(struct Stu* ps)
{
	ps->age = 20;//结构体指针->结构体成员
	strcpy(ps->name, "张三");//字符串拷贝
}

void print_Stu(struct Stu t)
{
	printf("%s %d\n", t.name, t.age);
}

int main()
{
	struct Stu s = { 0 };
	set_Stu(&s);
	print_Stu(s);

	return 0;
}

3. 结构体传参

#include <stdio.h>

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

原因:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/75273.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可白嫖的4家免费CDN,并测试其网络加速情况(2023版)

网站加载速度优化过程中&#xff0c;不可避免的会用上CDN来加速资源的请求速度。但是市面上的CDN资源几乎都是要收费的&#xff0c;而且价格还不便宜&#xff0c;对于小公司站长来讲&#xff0c;这将是一笔不小的开销。不过还是有一些良心公司给我们提供了免费的资源&#xff0…

私密相册管家-加密码保护私人相册照片安全

App Store史上最安全、最强大、最卓越的私密相册App&#xff01;再也不用担心私密照片视频被别人看见了&#xff01;
私密相册为你提供多重密码保护机制、简单便捷的照片存储空间&#xff0c;完美地将你的私密照片远离一切恶意偷窥者的窥探&#xff01; 【产品功能】
 √ 支…

【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector

文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1&#xff09;在自然语言处理NLP领域&#xff0c;是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度&#xff0c;通常在几…

两天入门Linux、搭建Spring环境 第一天

一、Linux简介 1.什么是Linux 一个操作系统&#xff0c;未来公司里面会用到、接触的新操作系统。 2.为什么学Linux (1)个人职务需要&#xff0c;肯定会接触到Linux (2)职业发展&#xff0c;以后的发展肯定需要掌握Linux的许多使用方法 3.学哪些内容 (1)Linux基本介绍 (2)…

Prometheus入门

Prometheus(普罗米修斯) 是一种 新型监控告警工具,Kubernetes 的流行带动了 Prometheus 的应用。 全文参考自 prometheus 学习笔记(1)-mac 单机版环境搭建[1] Mac 上安装 Prometheus brew install prometheus 安装路径在 /usr/local/Cellar/prometheus/2.20.1, 配置文件在 /usr…

Qt 之 QPushButton,信号与槽机制

文章目录 前言一、QPushButton二、信号与槽机制总结 前言 一、QPushButton 当我们开发基于Qt框架的图形用户界面&#xff08;GUI&#xff09;应用程序时&#xff0c;经常需要在界面上添加按钮来实现用户交互。Qt提供了一个名为 QPushButton 的类作为按钮控件的实现。QPushButt…

题解 | #1002.Shortest path# 2023杭电暑期多校9

1002.Shortest path 签到题 记忆化搜索 题目大意 给定一个正整数 n n n &#xff0c;可以对其进行以下操作&#xff1a; 如果 n n n 能被 3 3 3 整除&#xff0c;则可以使 n n / 3 nn/3 nn/3 ;如果 n n n 能被 2 2 2 整除&#xff0c;则可以使 n n / 2 nn/2 nn/2 …

探索Java中的静态变量与实例变量:存储区域、生命周期以及内存分配方式的区别

文章目录 静态变量实例变量不可变对象静态变量和实例变量有什么区别&#xff1f;静态变量实例变量 Object 类都有哪些公共方法&#xff1f;Java 创建对象有哪几种方式&#xff1f;ab 与 a.equals(b) 有什么区别&#xff1f;总结 &#x1f389;欢迎来到Java面试技巧专栏~探索Jav…

贝锐蒲公英:快速搭建连锁门店监控体系,赋能企业高效管理

随着国民生活水平的提高和零售场景的变革&#xff0c;消费者对于餐饮类目的消费支出不断增加&#xff0c;线下社区生鲜商超作为下沉市场最主要的消费场景之一&#xff0c;蕴藏着巨大价值机会。 对于线下连锁生鲜超市而言&#xff0c;连锁门店多、员工多&#xff0c;门店管理时会…

如何使用CSS实现一个响应式网格布局?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式网格布局⭐ 设置基本的HTML结构⭐ 创建基本的CSS样式⭐ 添加媒体查询以实现响应式效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端…

【Vue-Router】路由传参

1. query 传参 list.json {"data": [{"name": "面","price":300,"id": 1},{"name": "水","price":400,"id": 2},{"name": "菜","price":500,"…

C#质检工具(StyleCop、SonarLint)

1、StyleCop StyleCop工具主要类似java中的checkStyle,是检查代码样式规范的工具。 1.1、StyleCop安装流程: 图1.1 图1.2 图1.3 安装StyleCop插件时可能会遇到下载特慢或卡住不动的情况,需注意: 1)网上说的关闭IPV6功能不管用 2)网上说的自动指定dns不管用 3)网上…

Qt应用开发(基础篇)——滚屏区域基类 QAbstractScrollArea

一、前言 QAbstractScrollArea滚屏区域抽象类继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是QListview(列表浏览器)、QTableview(表格浏览器)、QTextEdit(文本编辑器)、QTextBrowser(文本浏览器)等所有需要滚屏区域部件的抽象基类。 框架类QFrame介绍 QAbstractSc…

软件工程概述-架构师(三)

软件工程概述&#xff08;老版&#xff09; 软件开发生命周期&#xff1a; 软件定义时期&#xff1a;包括 可行性研究和详细需求分析过程&#xff0c;任务是软件工程必需完成的目标&#xff0c;具有可行问题分析、可行性研究、需求分析等。软件开发时期&#xff1a;软件的 设…

11 - git stash 开发中临时加塞了紧急任务怎么处理

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 开发中临时加塞了紧急任务怎么处理 开发中临时加塞了紧急任务怎么处理 当你此时工作区已经修改了 Readme 文件&#xff0c;然后突然需要解决其他问题&#xff08;紧急问题、新任务&…

HbuildX生成安卓签名证书

HbuildX生成安卓签名证书 安装和配置JRE环境 根据此链接安装和配置JRE环境 生成签名证书 keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystoretestalias是证书别名&#xff0c;可修改为自己想设置的字符&#xff0c;建议…

Java旋转数组中的最小数字(图文详解版)

目录 1.题目描述 2.题解 分析 具体实现 方法一&#xff08;遍历&#xff09;&#xff1a; 方法二&#xff08;排序&#xff09;&#xff1a; 方法三&#xff08;二分查找&#xff09;&#xff1a; 1.题目描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&a…

深入了解电脑硬件以及多线程编程

文章目录 认识计算机硬件与多核CPU的工作原理单核CPU多核CPU并发与并行 深入了解进程、线程及其优先级进程与线程线程的创建与命名线程的优先级与控制线程的休眠与等待 线程安全与锁机制同步与异步线程安全问题与锁可重入锁解决线程安全问题 多线程间的通信与线程池的使用线程通…

无涯教程-Perl - select函数

描述 此函数将输出的默认文件句柄设置为FILEHANDLE,如果未指定文件句柄,则设置由print和write等功能使用的文件句柄。如果未指定FILEHANDLE,则它将返回当前默认文件句柄的名称。 select(RBITS,WBITS,EBITS,TIMEOUT)使用指定的位调用系统功能select()。 select函数设置用于处理…

每天一道leetcode:1129. 颜色交替的最短路径(图论中等广度优先遍历)

今日份题目&#xff1a; 给定一个整数 n&#xff0c;即有向图中的节点数&#xff0c;其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色&#xff0c;并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges&#xff0c;其中&#xff1a; redEdges[i] [ai, bi…