c语言 结构类型(详细)
前言
在编程中,有许多变量可以归为一类,例如 year,month,day三者可以归为date。于是乎就有了c语言的一个关键字:结构。
结构类型
结构类型是定义的新变量类型(和int,float地位一样)。与枚举不同的是,结构里的变量可以自己设定,结构类型声明后要加上 ; 。而且一般而言,为了使结构里的变量能被所以函数使用,结构的声明一般是在main函数外面。(也就是全局变量)
而且在结构类型声明后,可以用这个类型定义新的变量,叫做结构变量,每一个结构变量都有和上面时一样多的子变量,叫做成员变量。不同结构变量的成员变量互不相同,即使它们名字一样。
结构类型的声明和使用
声明方法一:
struct date {int year; int month;int day;};//声明一个结构变量date//
struct date today;//定义一个类型为strct date 的变量为today//
today.year=2022;//每一个today里面都有在之前声明的三个成员变量//
today.month=08;
today.day=02;
声明方法二:
struct {int year ;int month;int day;}today,yesterday;
//该声明的结构类型没有名字,但是结构中有三个成员变量,而且有两个属于该结构的变量//
声明方法三:
struct date{int year,int month,int day;} today,yesterday;
方法三是比较常用的结构声明方法,而方法二的声明
再结构前面也可以加cosnt表面不可修改,这个经常用在函数传值中(结构变量函数传值见下文)
一般只是用于编程时只想短期内使用一个结构变量,而不是长期使用。但无论怎么使用,建议都给结构类型一个名字
结构变量初始化
结构变量的初始化可以类似数组的初始化。如果全部没有初始化,成员变量的值就是该地址原本有的值。如果有些变量初始化了有些没有,则没有初始化的成员变量就会被初始化为0.
其中 “ .” 英文句号就像数组中[]一样 ,是访问成员变量的符号
struct date today={2022,08,02};//类似数组初始化,2022给year//
struct date vtoday={ .year=2022, .month=02, .day=02};
//如果初始化的个数少于其有的全部变量,则没有被初始化的变量都会是0//
输入与输出
结构的输入输出用%i,后面结构变量.成员变量 。取成员符号 . 的优先级高于取址符号&
scanf("%i ",&today.year);
printf("today is %i-%i-%i",today.year,today.month,today.day);
结构运算
today=(struct date){2022,08,02};//赋值,相当于 date.year=2022//
//()是强制类型转换,把{}中的不同值转换成struct date类型然后赋给today//
today=yestoday;//相当于today.year=yesterday.year,month和day同理//
其他的运算和一般变量运算是一样的,但是使用时要用today.day
结构指针
struct date *pdate=&today 该指针指向today里的所有成员变量
(*pdate).year=2022 或者 pdate->year=2022 该指针指向today里的成员变量year
结构变量的指针一定要加&,因为它也是一种变量,和int等相似, 和数组不一样
示例代码:
#include<stdio.h>struct test//定义一个结构类型//
{int x;int y;
}pl;int main( )
{ struct test pl ={1,2};//初始化//
struct test *p=&pl;//*p指针指向结构变量pl//
struct test *q=&pl;
printf("%p\n",*p);
(*p).x=4;
q->y=6;
printf("x=%i,y=%i\n",pl.x,pl.y);
system("pause") ;//vscode中防止退出//return 0;
}
结构类型作为函数参数
新定义的结构类型即可以作为()里的参数,将整个结构变量传入函数,也可以作为返回类型返回一个结构变量。返回值也可以用于运算
struct date newfunction(struct date d);
//一个返回类型为struct date的函数,其需要的参数是struct date d (也就是成员变量)//
struct date f2(struct date);
//传入参数是结构变量//
注意,结构变量和成员变量作为函数参数是不一样的,前者是(struct date),后者是(struct date d)
函数返回值后一般不会改变main函数里面的变量,如果要,那么传入的应该是指针。或者是在函数里再新建一个一样的结构,不同的结构变量,返回该新建的结构变量
如果结构变量很大,那么新建一个就会很麻烦。因此一般建议是传入指针
原理:当函数参数是结构变量时,函数会在内部建立一个新的结构变量(和参数的类型相同的),并把传入函数的结构变量复制到新建立的结构变量
结构数组
结构数组使用前要先定义一个结构类型
格式 struct 结构类型 结构变量 []
后面可以跟赋值等运算操作
示例:
struct test
{ int a;int b;
int c;};void main ()
{ struct test p1[]={{1,2,3},{4,5,6},}
scanf("%i",p1[2].b);//将读取的一个值赋给第二个结构数组的成员变量b//
printf("%i",p1[1].a);//将第一个结构数组的成员变量a输出//
}
再这个结构数组中,有两个子结构变量,其中一个里的成员变量值分别是1,2,3 另一个成员变量的值分别是 4 ,5 ,6
结构的嵌套
在定义两个结构后,其中一个结构变量的成员变量可以是另一个结构变量
struct point {int x ;int y;};
struct rectangle {struct point p1;struct point p2};
//point指点,确定平面上一个点需要xy两个坐标//
//rectangle是指矩形,确定一个矩形需要一对点//
struct rectangle r //没有初始化,只是示例//
r.p1.x=1;
r.p2.y=6;
图片来源于浙大翁恺c语言结构嵌套
人类的组合是无限的,结构,数组可以互相嵌套
例如一个结构变量的成员变量是数组,这个数组的单元可以是另一个结构变量,这个结构变量的成员变量又可以是新的数组,反反复复套娃。
对于数组和结构的使用情况,就看个人的能力和经验
typedef
typedef是一个c语言的关键字,该关键字可以声明一个已有类型(int,float,struct等)的新名字
typedef int length;
length a=0;
length b[21]={0};
声明这个后,length就成了int 的另一个名字,之后就可以在其他地方声明length类型的变量,其本质还是int
也可以声明struct的typedef,自此后使用struct就可以不用每次都加上新结构的名字
typedef struct date { int year;int month;int day}today;
today={2022,08,02};
c语言 结构类型(详细)相关推荐
- c语言结构类型ppt,C语言 第10章 结构类型与其他构造类型.ppt
C语言 第10章 结构类型与其他构造类型 第7章 结构类型与其它构造类型 本章的主要内容 1.三种新的复杂数据类型:结构体型.共用体型.枚举型的概念与作用. 2.结构体的定义方法,结构体型变量.数组. ...
- c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...
C语言结构体详细教学开始 前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号 ...
- Gox语言中的结构类型-GX10.1
Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.对映射 ...
- 两个结构体变量可以直接赋值吗_Gox语言中的结构类型-GX6
Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.因此, ...
- 浅谈C语言自定义类型枚举和联合体以及对结构体位段的补充
文章目录 前言 一.结构体位段的补充说明 1.结构体位段的定义 2.位段的内存规则 3.位段的总结 2.枚举类型 1.枚举的简单介绍 3.联合体类型 1.联合体简单介绍 2.联合体存储方式 4.总结 ...
- HTML语言的语法结构,语言的语法结构类型
人类语言的语法结构类型有几种分类法 人类语言的语法结构类型有四种分类法:孤立语.粘着语.曲折语和复综语. 请喜欢. 语言的语法结构类型有哪些 论述题 语法范畴有广义和狭义之分.广义语法范畴是各种语法形 ...
- linux c 结构体参数,C语言结构体类型定义
C语言结构体类型定义 结构体的定义形式如下: struct 结构体名 { 结构体成员 }: 结构体变量的定义方式有三种: 1.先定义结构体,再定义变量: eg. struct student{ cha ...
- c语言sockaddr_in结构体,转:sockaddr与sockaddr_in结构体详细讲解
sockaddr与sockaddr_in结构体详细讲解 二者区别 struct sockaddr { unsigned short sa_family; /* address family, ...
- 关于c语言结构体偏移的一点思考
注:此处只是利用了编译器的特性来计算结构体偏移 这句话就一笔带过,说得有点牵强附会.以后有时间自己再详细了解一下编译器的特性... more exceptional c++ 中文版 26页 https ...
最新文章
- apkplug插件托管服务简化与简介-05
- 【数理知识】Riccati 黎卡提 system
- 如何使用 HttpReports 监控 .NET Core 应用程序
- linuxpip安装python包_Windows+Linux安装Python包管理工具pip
- node缓冲区_Node.js缓冲区介绍
- Rstudio调用plot()函数时,出现错误的处理方法
- KDB支持单步调试功能(ARM架构)
- w10无法连到家庭组计算机,一键W10装机版无法进入家庭组如何处理
- 查看mysql表和数据库的大小
- 使用PADDING-TOP:(PERCENTAGE)实现响应式背景图片
- 计算机5800计算道路标高程序,强大的高速公路坐标高程计算软件
- NBSI2内部功能实现大揭谜 1
- w10系统 怎么快捷搜索服务器,w10系统怎么远程连接服务器
- Ubuntu20.04成功安装google浏览器,并正常使用Bing等其他搜索引擎
- 智能POS删除文件和数据库操作步骤
- macbook pro怎么养小宠物?macbook pro养宠物设置方法
- 简单的猜数字小游戏(1 ~ 100)
- 分布式环境搭建之Redis安装及使用
- 想快速发表自然语言处理论文?推荐一个出论文的好方向!
- openssh linux 下载,OpenSSH 下载与配置
热门文章
- 计算机二级及格后可以重考吗,自考本科考及格后因分数不高,可以要求重考吗...
- 跟心爱的人表白吧 express Love
- 南航数据分析与挖掘课设1(上)——基于多元线性回归模型,ARIMA序列的中国GDP增长影响因素研究及预测(R语言)
- html文本框%3cdiv%3e,localStorage.setItem不能存储html的字符串
- ubuntu18.04配置镜像源
- 【Python网络蜘蛛】基础 - 多线程和多进程的基本原理
- php自定义函数计算器,PHP实现简单计算器
- 利用指针求向量乘积C语言,创建指针的c向量
- Visual Reasoning(1): CLEVR Dataset
- 【智能汽车,未来最强的算力终端】-转载