首页 > 其他分享 >初识结构体

初识结构体

时间:2023-01-07 10:00:21浏览次数:43  
标签:struct int char Stu 初识 printf 结构

  • 结构体类型的声明
  • 结构体变量的定义和初始化
  • 结构体成员访问
  • 结构体传参

自学b站“鹏哥C语言”笔记。

一、结构体类型的声明

1.结构的基础知识

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

2.结构的声明

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

  • struct 结构体关键字
  • tag 结构体标签(可以随意替换)
  • struct tag 结构体类型
  • member-list 成员变量列表
  • variable-list 变量列表(可省略)
  • 大括号{ }后的分号 ; 不能少,因为声明是一条语句

例1:

//描述一个学生,需要一些数据,如名字、年龄、电话、性别
struct Stu
{
char name[20];
short age;
char tele[12];
char sex[5];
};
int main()
{
struct Stu s1;
struct Stu s2;
struct Stu s3;
return 0;
}

可以改写为:(区别是上面这段代码的s1,s2,s3是局部变量,下面的是全局变量

struct Stu
{
char name[20];
short age;
char tele[12];
char sex[5];
}s1,s2,s3;

扩展:用​​typedef​​可以对结构体类型进行改名

typedef struct Stu
{
char name[20];
short age;
char tele[12];
char sex[5];
}Stu;//更改类型名为Stu
int main()
{
Stu s1;//创建变量时的类型名为Stu,继续使用struct Stu也可以
Stu s2;
Stu s3;
return 0;
}

3.结构成员的类型

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

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

(1)声明类型的同时定义变量

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

(2)单独定义变量

struct Point
{
int x;
int y;
};
int main()
{
struct Point p2;
}

(3)初始化:定义变量的同时赋初值,用大括号{ }表示

struct Point
{
int x;
int y;
};
int main()
{
struct Point p3 = {1, 2};
}

(4)初始化:结构体嵌套初始化

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 bit\n";
struct T t = {"hehe", {100, 'w', "hello world", 3.14}, arr};//里面的结构体也需要用大括号{}

//访问时用.连接
printf("%s\n", t.ch);//hehe
printf("%s\n", t.s.arr);//hello world
return 0;
}

三、结构体成员访问

1.结构体成员访问的方式

结构体 . 成员名

结构体指针 -> 成员名

例1:

struct Stu
{
//放学生的一些相关属性
char name[20];
int age;
char id[20];
}Stu;

void Print1(Stu tmp)
{
//用.来访问结构的成员
printf("%s\n", s1.name);
printf("%d\n", s1.age);
printf("%s\n", s1.id);
}

void Print2(Stu* tmp)
{
//用->来访问结构的成员
printf("%s\n", ps->name);
printf("%d\n", ps->age);
printf("%s\n", ps->id);
}

int main()
{
Stu s = {"张三", 20, "20230104"};
Print1(s);
Print2(&s);
//两个函数打印的结果是一样的
return 0;
}

两种方法中较优的是用指针访问。考虑传参时占用的空间,Print1需要创建一个和s相同大小的空间,而Print2只需要创建一个指针大小(4/8字节)即可。

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

2.补充说明:压栈

C语言中的内存

栈区

局部变量

函数的形式参数

函数调用开辟空间

堆区

动态内存分配

涉及的函数:malloc/free,realloc,calloc等

静态区

全局变量

静态变量

数据结构:

线性数据结构

顺序表

链表

栈:先进后出。插入一个元素叫压栈,删除一个元素叫出栈

队列

树形数据结构

二叉树


四、结构体传参

由上一部分【三、结构体成员访问】得到结论:

结构体传参的时候,优先选择传结构体的地址

标签:struct,int,char,Stu,初识,printf,结构
From: https://blog.51cto.com/u_15883132/5995413

相关文章

  • IDA---创建结构体
    IDA---创建结构体创建结构体并应用到相应数据上,可以更好理解数据含义。创建结构体在Structures窗口,在所有结构体后按Ins即可开始创建结构体,一些操作如下:按键:解......
  • R语言有极值(EVT)依赖结构的马尔可夫链(MC)对洪水极值分析|附代码数据
    阅读全文 : http://tecdat.cn/?p=17375最近我们被客户要求撰写关于极值分析的研究报告,包括一些图形和统计输出。为了帮助客户使用POT模型,本指南包含有关使用此模型的实......
  • Java基础之if与switch结构
    If单选择结构1.结构If(布尔表达式){  //boolean类型直接在括号里写常量名//如果布尔表达式为true,将执行语句}2.实例2.1publicclassDemo01{//录入一个整数......
  • Web 3.0应用程序的体系结构 (转的)
    原文地址: https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-applicationWeb2.0  Web3.0 前端代码如何与以太坊上的智能合约进行通信......
  • 第一节:环境准备、项目结构详解、App.vue/main.js/uni.scss详解、各种引用(组件/js/css
    一. 环境准备1. HbuilderX 下载地址:https://www.dcloud.io/hbuilderx.html 2. 微信开发工具 下载地址:https://developers.weixin.qq.com/miniprogram/dev......
  • Hap-Eval:Sentieon团队开发的开源结构变异SV准确率评估工具
    Sentieon开发的Hap-eval准确率评估工具在设计之初就考虑到了复杂以及重复的基因组区域,采用了基于单倍型拼接序列的矩阵比较模式,兼容包括PacBio和ONT在内的主流三代长读长测......
  • 理解HashMap底层数据结构
    文章目录​​`hash`​​​​常用解决哈希冲突方法​​​​链地址法​​​​开放地址法​​​​`array`​​​​链表​​​​红黑树​​​​`HashMap`​​​​参考文章​​在......
  • QFramework v1.0 使用指南 工具篇:15. 补充内容:GridKit 二维格子数据结构
    在做游戏的过程中,我们经常需要处理二维格子类的数据,比如消除类游戏、俄罗斯方块、各种棋类游戏,还有我们最常用的Tilemap的地块数据,这些都需要二维格子数据结构。而在Ga......
  • .Net 7 内存模型函数描述结构MethoDesc
    楔子讲一些CLR里面的内存模型。本篇MethodDesc,意为函数的描述之意,看下一个函数在CLR里面是如何被描述的。MethodDesc结构这个结构体在CLR里面高达1600多行,这里仅截取......
  • 初识指针
    指针是什么指针和指针类型野指针指针运算指针和数组二级指针指针数组自学b站“鹏哥C语言”笔记。一、指针是什么指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑......