初识结构体

文章目录

  • 目录
    • 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 = "张三";//errstrcpy(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函数。

原因:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优哲SSD大文件写性能测试

SDD磁盘性能测试&#xff1a; 空盘&#xff1a; 大文件读&#xff0c;写&#xff0c;读写&#xff08;4/6&#xff09;性能测试&#xff0c;删除性能测试&#xff0c;N进程&#xff0c;N线程 小文件读&#xff0c;写&#xff0c;读写&#xff08;4/6&#xff09;性能测试&am…

《Learning Combinatorial Optimization Algorithms over Graphs》阅读笔记

一.文章概述 本文提出将强化学习和图嵌入的组合以端到端地自动为图上组合优化问题设计贪心启发式算法&#xff0c;以避免设计传统算法所需要的大量专业知识和试错。学得的贪心策略行为类似增量构造解决方案的元算法&#xff0c;动作由解决方案当前状态上的图嵌入网络确定。作者…

【BASH】回顾与知识点梳理(二十二)

【BASH】回顾与知识点梳理 二十二 二十二. Linux 账号管理22.1 Linux 的账号与群组使用者标识符&#xff1a; UID 与 GID使用者账号/etc/passwd 文件结构/etc/shadow 文件结构 关于群组&#xff1a; 有效与初始群组、groups, newgrp/etc/group 文件结构有效群组(effective grou…

Object 类的常见方法

文章目录 一、对象创建和销毁方法&#xff1a;二、对象信息获取方法&#xff1a;三、对象比较方法&#xff1a;四、线程相关方法&#xff1a;五、锁相关方法&#xff1a;六、使用案例&#xff1a;1、对象创建和销毁方法&#xff1a;2、对象信息获取方法&#xff1a;3、对象比较…

未济卦-物不可穷

前言&#xff1a;学无止境&#xff0c;人生没有终点&#xff0c;虽说是六十四卦的最后一卦&#xff0c;仍是“未济”&#xff0c;今天学习未济卦的卦辞和爻辞。 卦辞 亨&#xff1b;小狐汔济&#xff0c;濡其尾&#xff0c;无攸利。 序卦&#xff1a;无不可穷也&#xff0c;故…

jQuery EasyUI datagrid 无记录时,增加“暂无数据“提示

我们只需要在onLoadSuccess中添加如下代码&#xff1a; if (data.total 0) {var body $(this).data().datagrid.dc.body2;body.find(table tbody).append(<tr><td width" body.width() " style"height: 35px; text-align: center;"><h…

Blender 混合现实3D模型制作指南【XR】

本教程分步展示如何&#xff1a; 减少 3D 模型的多边形数量&#xff0c;使其满足 Microsoft Dynamics 365 Guides 和使用 Microsoft Power Apps 创建的应用程序中包含的混合现实组件的特定性能目标的性能需求。将 3D 模型的多种材质&#xff08;颜色&#xff09;组合成可应用于…

docker发展历史

docker 一、docker发展历史很久以前2013年2014年2015年2016年2017年2018年2019年及未来 二、 docker概述定义&#xff1a;docker底层运行原理:docker简述核心概念容器特点Docker与虚拟机的区别: 三、容器在内核中支持两种重要技术四、namespace的六项隔离五、虚拟化产品有哪些1…

Linux之awk判断和循环

echo zhaoy 70 72 74 76 74 72 >> score.txt echo wangl 70 81 84 82 90 88 >> score.txt echo qiane 60 62 64 66 65 62 >> score.txt echo sunw 80 83 84 85 84 85 >> score.txt echo lixi 96 80 90 95 89 87 >> score.txt把下边的内容写入到s…

Python学习笔记_基础篇(一)_初识python

Python简介 python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;吉多范罗苏姆为了在阿姆斯特丹打发时间&#xff0c;决心开发一个新的脚本解释程序&#xff0c;作为ABC语言的一种继承。 Python和其他语言的对比&#xff…

云原生网关API标准背景及发展现状

Gateway API是一个开源的API标准&#xff0c;源自Kubernetes SIG-NETWORK兴趣组。从出身角度讲&#xff0c;可谓根正苗红&#xff0c;自从开源以来备受关注&#xff0c;被寄予厚望。Gateway API旨在通过声明式、可扩展性和面向角色的接口来发展Kubernetes服务网络&#xff0c;并…

C++入门基础(万字详解!!!)

文章目录 前言1.C关键字2.命名空间3.C的输入输出4.缺省参数4.1 全缺省4.2 半缺省 5.函数重载6. 引用6.1 引用的特性6.2 引用的使用场景6.3 引用和指针 7.内联函数7.1 特性 8.auto关键字8.1 注意事项 9. 基于范围的for循环9.1 使用条件 10.指针控制nullptr10.1 注意事项 11.总结…