前言

在编程中,有许多变量可以归为一类,例如 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语言 结构类型(详细)相关推荐

  1. c语言结构类型ppt,C语言 第10章 结构类型与其他构造类型.ppt

    C语言 第10章 结构类型与其他构造类型 第7章 结构类型与其它构造类型 本章的主要内容 1.三种新的复杂数据类型:结构体型.共用体型.枚举型的概念与作用. 2.结构体的定义方法,结构体型变量.数组. ...

  2. c语言 结构体_颖儿教你学C语言结构体,全面讲解,让程序小白玩转结构体编程...

    C语言结构体详细教学开始 前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号 ...

  3. Gox语言中的结构类型-GX10.1

    Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.对映射 ...

  4. 两个结构体变量可以直接赋值吗_Gox语言中的结构类型-GX6

    Gox语言中,结构类型(struct)其实并不是很常用,因为Gox语言本身就是动态类型的语言,一般的类似结构体的数据直接用数组或者映射类型就可以了,里面的数据项可以是任意类型,包括嵌套复合类型.因此, ...

  5. 浅谈C语言自定义类型枚举和联合体以及对结构体位段的补充

    文章目录 前言 一.结构体位段的补充说明 1.结构体位段的定义 2.位段的内存规则 3.位段的总结 2.枚举类型 1.枚举的简单介绍 3.联合体类型 1.联合体简单介绍 2.联合体存储方式 4.总结 ...

  6. HTML语言的语法结构,语言的语法结构类型

    人类语言的语法结构类型有几种分类法 人类语言的语法结构类型有四种分类法:孤立语.粘着语.曲折语和复综语. 请喜欢. 语言的语法结构类型有哪些 论述题 语法范畴有广义和狭义之分.广义语法范畴是各种语法形 ...

  7. linux c 结构体参数,C语言结构体类型定义

    C语言结构体类型定义 结构体的定义形式如下: struct 结构体名 { 结构体成员 }: 结构体变量的定义方式有三种: 1.先定义结构体,再定义变量: eg. struct student{ cha ...

  8. c语言sockaddr_in结构体,转:sockaddr与sockaddr_in结构体详细讲解

    sockaddr与sockaddr_in结构体详细讲解 二者区别 struct sockaddr { unsigned short sa_family;     /* address family, ...

  9. 关于c语言结构体偏移的一点思考

    注:此处只是利用了编译器的特性来计算结构体偏移 这句话就一笔带过,说得有点牵强附会.以后有时间自己再详细了解一下编译器的特性... more exceptional c++ 中文版 26页 https ...

最新文章

  1. apkplug插件托管服务简化与简介-05
  2. 【数理知识】Riccati 黎卡提 system
  3. 如何使用 HttpReports 监控 .NET Core 应用程序
  4. linuxpip安装python包_Windows+Linux安装Python包管理工具pip
  5. node缓冲区_Node.js缓冲区介绍
  6. Rstudio调用plot()函数时,出现错误的处理方法
  7. KDB支持单步调试功能(ARM架构)
  8. w10无法连到家庭组计算机,一键W10装机版无法进入家庭组如何处理
  9. 查看mysql表和数据库的大小
  10. 使用PADDING-TOP:(PERCENTAGE)实现响应式背景图片
  11. 计算机5800计算道路标高程序,强大的高速公路坐标高程计算软件
  12. NBSI2内部功能实现大揭谜 1
  13. w10系统 怎么快捷搜索服务器,w10系统怎么远程连接服务器
  14. Ubuntu20.04成功安装google浏览器,并正常使用Bing等其他搜索引擎
  15. 智能POS删除文件和数据库操作步骤
  16. macbook pro怎么养小宠物?macbook pro养宠物设置方法
  17. 简单的猜数字小游戏(1 ~ 100)
  18. 分布式环境搭建之Redis安装及使用
  19. 想快速发表自然语言处理论文?推荐一个出论文的好方向!
  20. openssh linux 下载,OpenSSH 下载与配置

热门文章

  1. 计算机二级及格后可以重考吗,自考本科考及格后因分数不高,可以要求重考吗...
  2. 跟心爱的人表白吧 express Love
  3. 南航数据分析与挖掘课设1(上)——基于多元线性回归模型,ARIMA序列的中国GDP增长影响因素研究及预测(R语言)
  4. html文本框%3cdiv%3e,localStorage.setItem不能存储html的字符串
  5. ubuntu18.04配置镜像源
  6. 【Python网络蜘蛛】基础 - 多线程和多进程的基本原理
  7. php自定义函数计算器,PHP实现简单计算器
  8. 利用指针求向量乘积C语言,创建指针的c向量
  9. Visual Reasoning(1): CLEVR Dataset
  10. 【智能汽车,未来最强的算力终端】-转载