C语言-结构体【详解】

news2024/11/15 15:47:03

一、 结构体的基础知识

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

(1)结构体的声明

写法一:

注:

  • 括号后边的分号不能忘
  • 结构体末尾可以不创建变量,在主函数中再创建
struct Book
{
   char name[20]; //书名
   int price; //价格
};

写法二:

注:

  • 在结构体末尾和主函数中都可以创建变量
  • 区别:结构体后边直接创建的是全局变量,在主函数中创建的是局部变量

在这里插入图片描述
写法三:

注:

  • 可以利用 typedef 重命名或定义结构体
  • 若使用 typedef 定义,则结构体末尾不能创建全局变量,而应该写结构体新的名称,新名称后边的分号不能丢失
  • 若非要创建全局变量,需单独创建
  • 此处,新的结构体名称 Book 代替的是 struct Book 这一整体,在创建结构体变量时,可直接写Book b5;来代替struct Book b5;
typedef struct Book
{
	char name[20];
	int price;
}Book; //不可以创建全局变量,此处是新的结构体名

//如果实在想使用全局变量,需单独创建
Book b3;
Book b4;

int main()
{
	struct Book b1;
	struct Book b2;
	Book b5;
	Book b6;
	return 0;
}

(2)结构成员的类型

  • 结构的成员可以是标量、数组、指针,甚至是其他结构体
struct S
{
   char c;
   char arr[10];
   int *p;
};

struct B
{
   int a;
   struct S s;
   double d;
};

int main()
{
   return 0;
}

(3)结构体变量的初始化

例1:

struct S
{
	char c;
	char arr[10];
	int* p;
};

struct B
{
	int a;
	struct S s;
	double d;
};

int main()
{
	struct S s1 = { 'c',"张三",NULL }; //初始化
	int a = 10;
	struct B s2 = { 100,{'q',"list",&a},3.14 }; //结构体嵌套初始化
	return 0;
}

例2:

  • 初始化时可以按顺序初始化,也可以不按顺序
struct Book
{
	char name[20];
	int price;
};

int main()
{
	//按顺序初始化
	struct Book b1 = {"鹏哥C语言", 66};
	//不按顺序初始化
	struct Book b2 = { .price = 80, .name = "杭哥C++"};
	//打印
	printf("%s %d\n", b1.name, b1.price);
	printf("%s %d\n", b2.name, b2.price);
	return 0;
}

在这里插入图片描述

二、 结构体成员的访问

访问结构体成员的方式:

  • 结构体变量 . 结构体成员
  • 结构体指针 -> 结构体成员
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

struct Book
{
	char name[20];
	int price;
};

void print(struct Book* p)
{
	printf("%s %d\n", p->name, p->price);
}

int main()
{
	struct Book b1 = {"鹏哥C语言", 60};
	struct Book b2 = { .price = 80, .name = "杭哥C++"};
	struct Book b3 = { "JAVA",70 };

	//结构体变量.结构体成员
	printf("%s %d\n", b1.name, b1.price);
	printf("%s %d\n", b2.name, b2.price);

	//结构体指针->结构体成员
	struct Book* p1 = &b3;
	print(p1); //结构体地址传参

	return 0;
}

在这里插入图片描述

三、结构体传参

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

struct S
{
	int arr[100];
	int n;
};

void print1(struct S ss)
{
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", ss.arr[i]);
	}
	printf("\n%d\n", ss.n);
}

void print2(struct S* ps)
{
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n%d\n", ps->n);
}

int main()
{
	struct S s = { {1,2,3,4,5}, 100 };
	print1(s);
	print2(&s);

	return 0;
}

在这里插入图片描述

❗上面的 print1 和 print2 函数哪个好些❓

  • 答案:首选 print2 函数。

原因:

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

结论:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ChatGPT】sqlachmey 多表连表查询语句

感受下科技带来的魅力&#xff0c;这篇文章是通过ChatGPT自动生成的&#xff0c;不得不说技术强大!!! 在SQLAlchemy中进行多表连接查询可以使用join()方法或join()函数&#xff0c;具体用法如下&#xff1a; join()方法 join()方法可以在SQLAlchemy ORM中的查询中使用。假设…

根据指定函数对DataFrame中各元素进行计算

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】根据指定函数对DataFrame中各元素进行计算以下错误的一项是?import numpy as npimport pandas as pdmyDict{A:[1,2],B:[3,4]}myDfpd.DataFrame(myDict)print(【显示】myDf)print(myDf)print(【…

SMILES标准化方法以及其中的一个坑(手性)

rdkit.Chem.MolToSmiles()方法是用于将RDKit分子对象转换为SMILES字符串的方法。它的参数如下&#xff1a; mol&#xff1a;必需&#xff0c;要转换为SMILES字符串的RDKit分子对象。isomericSmiles&#xff1a;bool类型&#xff0c;是否生成同分异构体SMILES&#xff0c;默认为…

培训班出身的同学简历怎么做?面试要注意哪些?来自资深大厂HR的忠告

目录 1 不少培训班候选人的简历中&#xff0c;缺乏足够的商业项目年限 2 直接描述培训班学习经历会带来的负面影响 3 大龄转行Vs年轻的初级程序员&#xff0c;公司一般会如何选择&#xff1f; 4 经过培训班突击后&#xff0c;可以先面试小公司 5 面试官怎么面试有培训班经历…

安卓开发到底是做什么的

前言 在某平台看到了这样一个问题&#xff1a; 要知道&#xff0c;安卓开发是当前软件行业中的一个热门方向&#xff0c;它涉及到使用 Java 或 Kotlin 语言开发应用程序&#xff0c;运行在安卓操作系统上的手机、平板电脑、电视等设备上。在过去的几年中&#xff0c;随着智能…

追溯ChatGPT

ChatGPT 国内趋势 在国际学术界看来&#xff0c;ChatGPT / GPT-3.5 是一种划时代的产物 它与之前常见的语言模型 (Bert/ Bart/ T5) 的区别&#xff0c;几乎是导弹与弓箭的区别&#xff0c;一定要引起最高程度的重视 国际上的主流学术机构 (如斯坦福大学&#xff0c;伯克利加…

Ep_计网面试题-UDP实现TCP?

其实把TCP优点拿过来就行 直接上答案: 1、添加seq/ack机制&#xff0c;确保数据发送到对端 2、添加发送和接收缓冲区 3、添加超时重传机制 视频讲解: https://edu.csdn.net/course/detail/38090 点我进入 面试宝典 很多人不知道面试问什么,或者其他的XXGuide,那里边的太多没…

示波器上位机软件下载安装教程

软件&#xff1a;示波器软件NS-Scope 语言&#xff1a;简体中文 环境&#xff1a;NI-VISA安装环境&#xff1a;Win10以上版本&#xff08;特殊需求请后台私信联系客服&#xff09; 硬件要求&#xff1a;CPU2GHz 内存4G(或更高&#xff09;硬盘500G(或更高&#xff09; 驱动…

第十二 代码块、设计模式(懒汉、饿汉)

代码块概述 ●代码块是类的5大成分之一(成员变量、构造器&#xff0c;方法&#xff0c;代码块&#xff0c;内部类)&#xff0c;定义在类中方法外。 ●在ava类下&#xff0c;使用{}括起来的代码被称为代码块。 代码块分为 静态代码块: 格式:static{ 特点:需要通过static关键字修…

企业个人,没有品牌不好混

企业、个人没品牌没法持续混下去 “品牌资产”需要持续积累 频繁切换&#xff0c;品牌无法立 趣讲大白话&#xff1a;没点品牌没法混 【安志强趣讲信息科技91期】 ******************************* 企业品牌资产&#xff1a;指能给企业带来效益的消费者品牌认知&#xff0c;包括…

『C/C++养成计划』C++中的双冒号::名解析(Scope Resolution Operator)

C中的双冒号::名解析(Scope Resolution Operator)&#xff01; 文章目录1. 访问命名空间中的成员2. 访问类中的静态成员3. 嵌套类访问4. 在类之外定义函数5. 当存在具有相同名称的局部变量时&#xff0c;要访问全局变量6. C模板参数的自动推导参考文献C中的双冒号名解析&#…

外贸人如何写出优秀的开发信?附详细思路

如何写出优秀的开发信&#xff1f;最近做出口生意的客户都在抱怨&#xff0c;开发信的回复率越来越低&#xff0c;其实原因有很多&#xff0c;有时候并非自己的能力实在很欠缺。原因总结如图&#xff1a;第一&#xff1a;市场不景气这个就是就属于客观因素了&#xff0c;这也许…

InstructGPT论文笔记

论文链接&#xff1a;https://arxiv.org/pdf/2203.02155.pdf 1 摘要 做的事&#xff1a; 1、标注了数据&#xff0c;问题和答案写出来&#xff0c;然后训练模型 2、收集数据集&#xff0c;排序模型的输出&#xff0c;使用强化学习训练这个排序的过程 效果层面来说&#xff1…

思迅软件端口不通导致软件和软锁报错的问题

一、端口不通导致软件和软锁报错的问题 问题说明&#xff1a;打开软件提示到&#xff1a;xxx.xxx.xxx.xxx失败&#xff01; 处理步骤1&#xff1a; 假设软锁服务器IP为192.168.0.1&#xff0c;分别在服务器本机和客户端电脑测试软锁服务: 在服务器的浏览器中访问地址: http:/…

ChatGPT(GPT3.5) OpenAI官方API正式发布

OpenAI社区今天凌晨4点多发送的邮件&#xff0c;介绍了ChatGPT官方API的发布。官方介绍文档地址为“OpenAI API”和“OpenAI API”。 ChatGPT(GPT3.5)官方API模型名称为“gpt-3.5-turbo”和“gpt-3.5-turbo-0301”。API调用价格比GPT text-davinci-003模型便宜10倍。调用费用为…

补档:红黑树代码实现+简略讲解

红黑树讲解和实现1 红黑树介绍1.1 红黑树特性1.2 红黑树的插入1.3 红黑树的删除2 完整代码实现2.1 rtbtree.h头文件2.2 main.c源文件1 红黑树介绍 红黑树( Red-Black tree&#xff0c;简称RB树)是一种自平衡二叉查找树&#xff0c;是计算机科学中常见的一种数据结构&#xff0c…

python画直方图,刻画数据分布

先展示效果 准备一维数据 n 个数据元素计算最大值&#xff0c;最小值、均值、标准差、以及直方图分组 import numpy as np data list() for i in range(640):data.append(np.random.normal(1)) print(data)z np.histogram(data, bins64) print(list(z[0])) ### 对应 x 轴数据…

【C语言】LeetCode 27. 移除元素 的n种解法

文章目录题目描述解法一 快慢下标解法二 数组移位题目描述 OJ链接&#xff1a;27. 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(…

帮助100w人成功入职的软件测试面试常见问题以及答案

测试面试题怎么来设计测试方案根据测试需求&#xff08;包括功能需求和非功能性需求&#xff09;&#xff0c;识别测试要点&#xff0c;识别测试环境要求&#xff0c;安排测试轮次&#xff0c;根据项目计划和开发计划做整体的测试安排。被测试的特性&#xff1a;通过对需求规格…

MyBatis - 10 - 处理多对一映射关系 + MyBatis延时加载

文章目录1.准备工作1.1 建表1.2 创建Maven项目1.2.1 在pom文件中&#xff0c;修改打包方式为jar包&#xff0c;导入依赖1.2.2 创建日志配置文件和jdbc.properties1.2.3 创建Mybatis核心配置文件1.2.4 创建实体类以及实体类之间的关系1.2.5 创建SqlSession工具类2.为什么要单独处…