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};

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值