C语言基础7:结构体类型、声明、成员类型、定义、初始化、成员访问、传参

news2024/11/15 12:22:16

文章目录

  • C语言基础7:结构体类型、声明、成员类型、定义、初始化、成员访问、传参
  • 1. 结构体类型的声明
    • 1.1 结构体的基础知识
    • 1.2 结构体的声明
    • 1.3 结构体成员的类型
    • 1.4 结构体变量的定义和初始化
  • 2. 结构体成员访问
  • 4. 结构体传参

C语言基础7:结构体类型、声明、成员类型、定义、初始化、成员访问、传参

1. 结构体类型的声明

1.1 结构体的基础知识

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

  就好比一个学生,有身高、体重、学号、性别、身份证编号等信息,学生就可以理解为(身高、体重、学号、性别、身份证编号)的集合,而(身高、体重、学号、性别、身份证编号)这些值可称为成员变量,这些成员变量的类型都不一样,有整数、浮点型等

1.2 结构体的声明

//struct:结构体关键字,tag:结构体标签,struct tag:结构体类型
struct tag 
{
 member-list;//成员列表
}variable-list;//变量列表

例如:描述一个学生:

struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}s1,s2,s3;//分号不能丢,s1,s2,s3是3个全局的结构体变量

int main()
{
 struct Stu s;//局部变量
 return 0;
}
//struct Stu 另一种定义方式
typedef struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}Stu;//分号不能丢,这里的Stu是类型

int main()
{
 struct Stu student1;//局部变量
 Stu student2;
 return 0;
}

1.3 结构体成员的类型

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

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

struct Point
{
 int x;
 int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2

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

struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员
struct Stu
{
 char name[20];
 int age;
};

2. 结构体成员访问

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct S
{
    int a;
    char c;
    char arr[20];
    double d;
};

struct T
{
    char ch[10];
    struct S s;
    char* pc;
};

int main()
{
    char arr[] = "hello !\n";
    struct T t = { "hehe",{1,'a',"hello world",3.1415926},arr };
    printf("%s\n", t.ch);
    printf("%s\n", t.s.arr);
    printf("%lf\n", t.s.d);
    printf("%s\n", t.pc);
    return 0;
}

  通过函数打印结构体数据:
  方式一:
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
typedef struct Stu
{
	char name[20];
	short age;
	char telephone[12];
	char sex[5];
};

void Print1(Stu tmp)
{
	printf("name: %s\n", tmp.name);
	printf("name: %d\n", tmp.age);
	printf("name: %s\n", tmp.telephone);
	printf("name: %s\n", tmp.sex);
}

int main()
{
	Stu s = { "张三", 21,"18866669999", "男" };
	Print1(s);
}

  方式二:
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
typedef struct Stu
{
	char name[20];
	short age;
	char telephone[12];
	char sex[5];
};

void Print2(struct Stu* tmp)
{
	printf("name: %s\n", tmp->name);
	printf("name: %d\n", tmp->age);
	printf("name: %s\n", tmp->telephone);
	printf("name: %s\n", tmp->sex);
}

int main()
{
	Stu s = { "张三", 21,"18866669999", "男" };
	Print2(&s);
}

  上面两种方式较好的是第2种,原因:
  对于第①种方式:当Stu s = { "张三", 21,"18866669999", "男" };结构体创建时,假设会占用200个字节的空间。那么此时就占用了200个字节的空间,当函数在传参的时候,又会给 tmp 又会划出200个字节的空间,这样空间浪费就非常严重,同时,数据拷贝也非常消耗时间。
  对于第②种方式:在传参的时候,传的是一个地址过去,也就是占用4或8个字节。之后通过指针找回相关数据,然后进行相关数据的打印。

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

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

4. 结构体传参

压栈:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}

int main()
{
	int a = 10;
	int b = 20;
	int ret = 0;
	ret = Add(a, b);
	return 0;
}

  上面这个函数在我们内存空间是如何完成的呢,首先我们知道,任何一次函数调用,都会在内存当中的栈区上分配一块空间:
(1)栈区:①局部变量②函数的形式参数③函数调用也开辟内存空间
(2)堆区:①动态内存分配,涉及函数:malloc、free、realloc、calloc
(3)静态区:①全局变量②静态变量

  上面函数运行的流程:
(1)进入main函数,此时内存中的栈区会给main函数开辟一块内存单元
(2)之后创建变量:a、b、ret,同时会在分配给main函数的内存单元中再开辟3块儿内存单元区域,分别给a、b、ret。
(3)接下来调用Add函数,当调用Add函数的时候,首先需要进行传参,需要将 a 和 b 这两个参数传过去一个赋给x,一个赋给y,接下来就进行传参:
①先将b进行传参,同时在分配给main函数的内存单元外的栈区分配一块儿空间,这块儿空间叫 y
②a同理,再将a进行传参,再划一块儿内存空间给a,这块儿空间叫 x
(4)接下来进入Add函数,同样的,需要在栈区分配一块儿空间给Add函数,
(5)创建变量 z ,同样是在 Add函数中的内存空间内进行开辟。
(6)将x和y进行相加运算,赋值给z。
这个过程把 a 和 b 放进去了,这个动作叫做压栈操作,

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

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

相关文章

SAP S4HANA MM模块后台配置详解

目录 1. 常规设置 1.1 定义国家 1.2.计量单位配置 1.3.货币设置 1.4.维护日历 1.4.1 概念及功能说明 1.4.2 业务示例 1.4.3 配置步骤 2. 企业结构 2.1 定义和分配公司 2.2 设定评估级别、定义/分配工厂 2.2.1. 概念及功能说明 2.2.1. 业务示例 2.2.2. 配置步…

java 八股文

java 八股文 java篇 java 面向对象有哪些特征 封装 多态和继承 arrayList 和 LinkedList 的区别 数据结构不同&#xff0c;一个是数组一个是链表 arrayList 适合 随机访问 读多&#xff0c;插入和删除少 LinkedList 适合插入 和删除 多&#xff0c;按次序遍历的情况 再…

数据结构实验-折半插入排序-双向冒泡排序

目录 分析&#xff1a; 折半插入排序 双向冒泡排序 折半插入排序 思想&#xff1a; 代码 运行结果 双向冒泡排序 代码 运行结果 分析&#xff1a; 折半插入排序 折半插入排序&#xff0c;折半插入排序是在直接插入的改进&#xff0c;通过折半查找得到插入位置&#xf…

java自定义类加载器来加载本地class文件,用demo来解析类加载的双亲委派机制、沙箱机制、打破双亲委派机制

1、首先将class文件放入指定本地目录下 2、编写自定义类加载器demo代码来加载class文件 /*** author WuSong* version 1.0* date 2022/12/7 12:07* description*/ public class MyClassLoaderTest {/*** 1&#xff1a;继承ClassLoader类* 2&#xff1a;重写findClass方法*/sta…

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一小程序源码

2023最新扫码连wifi-扫码挪车-聚合CPS返利多合一系统 系统特点: 目前已接入的 CPS 渠道: 充值:话费充值、电费充值、影视会员充值、会员卡券充值 本地团购:联联周边游 电商平台:京东、拼多多、唯品会、淘宝、抖音美团:外卖、闪购、酒店、到店、优选饿了么:外卖、商超 出行服务:…

高压放大器在压电驱动器的机翼除冰方法研究中的应用

实验名称&#xff1a;高压放大器基于压电驱动器的机翼除冰方法研究 研究方向&#xff1a;压电效应、多普勒激光测振 实验原理&#xff1a;多普勒激光测振仪是基于多普勒激光测振原理工作的&#xff0c;当四边固支的矩形板通过驱动器激振起来时&#xff0c;通过激光扫描铝板上的…

知识图谱-KGE-语义匹配-双线性模型(打分函数用到了双线性函数)-2012:LFM(Latent Factor Model)

【paper】 A latent factor model for highly multi-relational data 【简介】 这篇文章是法国的研究团队发表在 NIPS 2012 上的文章&#xff0c;还挂了 Antoine Bordes 的名字。文章提出了 LFM&#xff08;Latent Factor Model&#xff09;&#xff0c;主要贡献有两点&#x…

机床测头应用一:仿形加工功能,降低废品率

机床测头是一种可安装在大多数数控机床上&#xff0c;并在加工循环中自动对工件的尺寸及位置进行测量的装置&#xff0c;使用合适的测量程序&#xff0c;还可以根据测量结果实现自动刀路补偿&#xff0c;可以保证“第一件和第一百件尺寸一致”&#xff0c;是批量生产中不可缺少…

PLC程序实例三:ModBusRTU客户端编程实例与测试方法

一、需求描述 1、设备作为ModBusRTU服务端时&#xff0c;需要给出对应的测试方法&#xff0c;即 PLC 作为主站&#xff0c;设备作为从站使用&#xff08;本文编写的是PLC主站程序&#xff09; 2、业务与上一篇文章ModBusTCP网络触发业务逻辑一致&#xff0c;描述如下&#xf…

SpringCloud学习笔记 - Nacos服务注册中心 - Nacos Discovery

1. Nacos简介 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您…

Git实战 | 让工作更高效,搞定Git的分支管理

上一篇讲到Git的分支管理实操&#xff0c;在线合并和本地合并都进行了实操。毕竟&#xff1a;光说不练是假把式。而只练不整理&#xff0c;只能是傻把式了。分支管理到底如何进行管理呢&#xff1f; 先以GitLab上的一张经典的图打头&#xff0c;作为一个总体概览&#xff0c;也…

汇编语言程序设计期末复习

汇编期末复习 第一章 汇编语言基础知识 机器指令&#xff1a;cpu能直接识别并遵照执行的指令&#xff0c;用二进制编码表示&#xff0c;由操作码&#xff0c;操作数组成&#xff0c;编码只含二进制0或1 机器语言&#xff1a;用二进制编码组成的机器指令的集合和一组使用机器…

java swing(GUI) MySQL实现的视频播放器系统源码+运行教程

今天给大家演示一下由Java swing实现的一款简单的多媒体播放器&#xff0c;项目源码我会放在我的网站上&#xff0c;并配有视频配置教程&#xff0c;保证运行起来的。这个小播放器实现了视频、音频文件的播放、暂停、快进、快退、停止、全屏等功能&#xff0c;还有历史记录功能…

Nacos学习

Nacos NacosNacosNacos 简介核心特性&#xff1a;Nacos 启动启动运行(windows)standalone&#xff08;单节点&#xff09;cluster模式Nacos Server 的配置数据是存在哪里呢&#xff1f;测试demo项目结构统一配置中心命名空间、分组、文件新建bootstrap.properties文件依赖contr…

字符串相似及匹配 Jaro-Winkler

前言 String str1 "明天吃红烧肉"; String str2 "明天中午吃红烧肉"; String str3 "明天吃红烧肉&#xff1f;"; String str4 "吃红烧肉";用普通的相等判断&#xff0c;只能得到是或否&#xff0c;但如果你在实际的业务需求中&am…

【中国信通院|低代码·无代码应用沙龙】低代码平台在云智慧的实践探索

从2014年 Forrester Research 首次提出“低代码开发平台&#xff08;LCAP&#xff09;”这一概念开始&#xff0c;低代码行业便备受关注。随着 SaaS 场景的加持&#xff0c;aPaaS 场景也被孵化了出来。与此同时&#xff0c;随着近两年 Outsystems 的快速发展&#xff0c;让其成…

猜数字-第11届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第97讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

【Unity】Entities 1.0 学习(二):调试工具

在 Entites 1.0 &#xff0c;Unity修改了之前的调试面板&#xff0c;以及在场景下构建 Ecs World 的流程&#xff0c;较之前的版本差别还是蛮大的。 之前的学习大多集中在代码和语法&#xff0c;很多是对之前成熟的代码做升级改造&#xff0c;所以没有用到新的调试工具。但是最…

Java以Graph方式发送Outlook、Exchange邮件(2022新版)

目录 问题提出 问解决题 注意 1、注册应用程序 2、引入需要依赖jar包——重点 3、微软管理员授予应用合适权限 参考链接 问题提出 在2022年10月份&#xff0c;微软公司出于安全考虑&#xff0c;陆续取消了Exchange邮件发送的Basic认证。通俗来说就是不能再用用户名密码…

ModuleNotFoundError: No module named ‘System‘解决办法

本人在做python和halcon接口的时候发现程序需要System库&#xff0c;报下面的错误 Traceback (most recent call last): File "D:/Project/pyhalcon/pcbhalcon.py", line 2, in <module> import System ModuleNotFoundError: No module named System Process …