【初阶C语言】学会结构体

news/2024/11/24 11:48:35/

1.结构体类型的声明
2.结构体初始化
3.结构体成员访问
4.结构体传参
 


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

一、结构体类型的声明

1.结构的声明

结构体声明的模板:

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

    这是一个模板的声明,得出来的结构体只是一种类型,与int char一样。

例如,我们需要描述一个学生的信息,能用int类型来描述学生吗?显然是不行的,因为学生包括了学号(char),名字(char),年龄(int)和性别(char),所以这不是一个单一的类型,就需要用到结构体来描述该学生。

第一种声明方式:这个结构体的全名为:strcut Stu

struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};//这里的分号不能丢

第二种方式:重命名

typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//给结构体类型重新取名为Stu

重新命名的方式还可以这样:

struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
typedef struct Stu Stu;//重新起一行来命名

第三种方式:在声明的时候创造变量

struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}S1;//这里的S1是结构体创造出来的全局变量

 上面一系列的操作都只是对一个结构体类型进行了声明而已,更多内容尽在后面。

2.结构体成员的类型

前言:在上面的模板我们可以知道,member_list是结构体成员,那结构体成员的类型可以是哪些呢?

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

struct A 
{char c;int a;
}; ​
struct B
{char b;int arr[10];struct A c;//成员为其他结构体成员struct A* F;//为指针类型
};

但是需要注意的是,结构体成员不可以是本身的结构体,但是可以是本身结构体指针。

3.结构体变量的创建和初始化

在前面的时候,我们有介绍过在声明的时候创造的全局变量,接下来都一起介绍了。

第一种创造方式:

#include<stdio.h>
struct Stu
{char c;int arr[10];
};
int main()
{struct Stu A;//结构体变量Astruct Stu B;//结构体变量Breturn 0;
}

这里创造的变量A和B都是局部变量。

第二种创造方式:

#include<stdio.h>
typedef struct Stu
{char c;int arr[10];
}Stu;//对结构体重命名
int main()
{//struct Stu A;//结构体变量A//struct Stu B;//结构体变量BStu C;//结构体变量Creturn 0;
}

第三种方式:上面提到过的创造全局变量

#include<stdio.h>
struct Stu
{char c;int arr[10];
}D;//全局变量D
int main()
{//struct Stu A;//结构体变量A//struct Stu B;//结构体变量B//Stu C;//结构体变量Creturn 0;
}

在创建后变量后,就该对变量进行初始化了

初始化:

#include<stdio.h>
struct Stu
{char name[20];int age;double height;
};
int main()
{struct Stu s1 = {"zhangsan",20,182.8};//顺序初始化struct Stu s2 = {.age=18,.height=188.5};//指定成员初始化return 0;
}

在创建变量的时候就初始化:

struct Stu
{char name[20];int age;double height;
}s3 = {"lisi",19,150.6};//创造的全局变量并初始化

二、结构体成员的访问

当完成结构体的声明、结构体变量的创建和初始化后,就可以使用结构体了,这就是涉及到结构体成员访问的知识。

结构体的访问有两个操作符:'.'操作符和'->'操作符

接下来我们通过初始化和打印的两个操作来举例说明结构体成员访问的例子。

#include<stdio.h>
struct Stu
{double height;int age;
};
void set_s1(struct Stu* ps)//用结构体类型指针接收
{ps->age = 22;ps->height = 188.45;//用"->"操作符访问结构体成员
}
void print(struct Stu s)
{printf("%d %lf",s.age,s.height);
}
int main()
{struct Stu s1 = { 0 };//这里先初始化成0//用一个函数对结构体变量赋值set_s1(&s1);//因为需要修改值,所以必须要传址//用一个函数打印结构体变量中的数据print(s1);//只需要打印,不需要修改。传值就可以return 0;
}

我们看一下运行的结果:

 在上面的例子中,出现了两个操作符,具体什么时候用哪个我们总结一下。(.和->)

结构体变量.成员名        结构体指针->成员名

就是在用指针的时候,左边必须是->,另一个同样的道理。

通过上面的例子我们可以知道,结构体既可以传值,也可以传地址,接下来我们一起看看这两个的差异吧。

1.传参

传参的话,需要重新开辟的空间很会很大,并且有的情况下传值是不能达成要求的,因为形参是实参的一份拷贝

2.传址

传址可以适用于所有的情况,并且所需要重新开辟的内存不大,所以尽可能使用结构体传址的方法。


http://www.ppmy.cn/news/1003681.html

相关文章

wsl安装ziran2019

首先从windows商店搜索ubuntu18 &#xff08;亲测Ubuntu20不行&#xff09; 然后第一次打开会自动安装。 &#xff08;我是用的wsl一代&#xff0c;二代没测试过&#xff09; 新安装的系统首先要更新apt sudo apt update然后设置git git config --global https.proxy http:…

coopeliasim之主客户端应用程序

CoppeliaSim是一个函数库&#xff1a;没有主客户端应用程序&#xff08;或主应用程序&#xff0c;或主循环&#xff09;&#xff0c;CoppeliaSim无法运行。安装包附带的默认主客户端应用程序是coppeliaSim.exe&#xff08;Windows&#xff09;或coppeliaSim&#xff08;MacOSX和…

【云原生K8s】二进制部署单master K8s+etcd集群

一、实验设计 mater节点master01192.168.190.10kube-apiserver kube-controller-manager kube-scheduler etcd node节点node01192.168.190.20kubelet kube-proxy docker (容…

这么好用的ai绘画软件,你不会还不知道吧?

AI绘画成为了我最近热衷的一项活动。在使用AI绘画过程中&#xff0c;我得到了许许多多美妙的图片。 虽然网上有很多AI绘画软件可以让我们选择&#xff0c;但其中的大多数软件需要收费&#xff0c;而且生成的图片质量良莠不齐&#xff0c;我之前就是因为随便乱用AI绘画软件&…

Linux 操作命令大全在线查询(持续更新中~)

作为一名前端收集的一些能在项目中用到的 linux 脚本命令 linux 中读取 JOSN 文件数据&#xff08;使用 jq 获取&#xff09;# 判断 jq 是否安装 if command -v jq >/dev/null 2>&1; thenecho "jq is installed"PKG_NAME$(jq -r .name package.json)PKG_V…

Django之JWT库与SimpleJWT库的使用

Django之JWT库与SimpleJWT库的使用 JWTJWT概述头部(header)载荷(payload)签名(signature) Django使用JWT说明jwt库的使用安装依赖库配置settings.py文件配置urls.py文件创建视图配置权限 SimpleJWT库的使用安装SimpleJWT库配置Django项目配置路由创建用户接口测试身份认证自定义…

论文阅读-Neighbor Contrastive Learning on Learnable Graph Augmentation(AAAI2023)

人为设计的图增强&#xff0c;可能会破坏原始图的拓扑结构&#xff0c;同时相邻节点被视为负节点&#xff0c;因此被推离锚点很远。然而&#xff0c;这与网络的同质性假设是矛盾的&#xff0c;即连接的节点通常属于同一类&#xff0c;并且应该彼此接近。本文提出了一种端到端的…

Stable Diffusion教程(6) - 图片高清放大

放大后细节 修复图片损坏 显存占用 速度 批量放大 文生图放大 好 是 高 慢 否 附加功能放大 一般 否 中 快 是 图生图放大 好 是 低 慢 是 tile模型放大 非常好 是 高 快 是 通过文生图页面的高清修复 优点&#xff1a;放大时能添加更多细节&am…