结构体与枚举类型

🌞欢迎来到C语言的世界 
🌈博客主页:卿云阁

 💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于锻体阶段,希望各位仙友顺利完成突破

📆首发时间:🌹2021年1月18日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


目录

0️⃣结构体类型变量的定义和别名

1️⃣结构体变量初始化和引用

2️⃣结构体数组

3️⃣指向结构体类型的指针

4️⃣结构体类型数据作为函数参数

0️⃣✨✨✨结构体类型变量的定义和别名✨✨✨  

在定义了一种结构体类型以后,就等于又产生了一种新的数据类型,可以用这种类型定义变量。定义结构体类型的变量有3种方式:

(1)先定义结构体类型再定义变量

例如,定义了结构体类型:

struct student

{  

int num;    //学号

char name[20];   //姓名

char addr[30];    //地址

};

完成这个结构体类型的定义后,就可以用“类型 变量名”的方式定义变量。例如,struct student  stuA,stuB;,这就定义了两个变量stuAstuB,它们都是struct student类型。

(2)在定义类型的同时定义变量

struct student

{  

int num;

char name[20];

char addr[30];

}stuA,stuB;

这样也定义了两个类型为struct student的变量stuAstuB,这种方式定义完变量以后,以后还可以用第一种方式继续定义这种结构体类型的其它变量。

(3)直接定义结构体类型变量

前面讲定义一个结构体类型时说过,结构体类型的tag是可以没有的,这称为匿名结构体类型。要定义匿名结构体类型的变量,则只能在定义完一个结构体类型后立即定义变量,而且在后续代码中,不能再定义这种类型的变量。

struct 

{  

int num;

char name[20];

char addr[30];

}stuA,stuB;

C中提供了一个关键字typedef,可以把结构体类型定义为一个别名,然后用这个别名去定义这种结构体类型的变量,而不用写成struct结构体名 变量名的形式。例如,

typedef struct student

{

long int num;

  char name[20];

  char sex;

  char addr[20];

 }Student;

关键字typedef把整个结构体类型struct student定义为一个别名Student,意思是struct student又叫做Student。有了这个别名,就可以用“别名 变量名”定义struct student类型的变量。例如,Student stu;就定义了一个名为stu的结构体类型变量,与struct student stu;的效果完全一样。

还可以用关键字typedef把同一种结构体类型指定为不同的数据类型别名,如指针形式的别名。例如,

typedef struct student

{

long int num;

char name[20];

char sex;

char addr[20];

 }Student,*stuPtr;

这里,指定了两个别名,Student是struct student结构体类型的别名,stuPtr是指向struct student结构体类型的指针类型别名。

stuPtr sPtr;相当于Student *sPtr;或者struct student *sPtr;。


1️⃣✨✨✨ 结构体变量初始化和引用✨✨✨

在结构体类型定义后,有三种方法对结构体类型变量进行初始化。

(1)结构体类型定义完成后,立即定义变量并用{}的方式赋初值。

struct student

{

long int num;

   char name[20];

   char sex;

   char addr[20];

 } stu={202018080,"qingyun",'m',"xiaoxian"};

(2)定义完一个结构体类型以后,在其它地方定义这种类型的变量时,用{}的方式进行初始化。

struct student stu={202018080,"qingyun",'m',"xiaoxian"};

(3)可以指定成员变量名进行初始化。

struct student stu={.num=18, .name="qingyun"};

结构体类型变量的引用(常用)

引用结构体成员变量与引用基本数据类型变量有点不一样,为了访问结构体成员,要使用成员选择符(.),成员选择符是结构体变量名与要访问的结构成员之间的一个点号。例如,有定义struct student stu,要给结构体中的两个成员变量赋值,可以用下面两条语句实现。

stu.num=202018080;

strcpy(stu.name, "qingyun");stu.num=202018080;

strcpy(stu.name, "qingyun");

综合例子

给定一个结构体类型,定义两个这种结构体类型的变量stu1和stu2,对stu1进行初始化,然后把stu1的值赋给stu2,然后修改stu2的两个成员值,最后输出两个变量的所有成员值。

#include <stdio.h>
typedef  struct student
{
  long int num;
  char name[20];
  char sex;
  char addr[20];
 }Student;
int main(void)
{
/*定义两个变量结构体变量stu1和stu2,并初值化stu1 */
Student stu1={202018080,"qingyun",'m',"xiaoxian"},stu2;
stu2=stu1;        //把stu1的值赋给stu2,可赋所有成员变量的值。
stu2.num=202018081;  //给stu2的num成员变量赋值。
strcpy(stu2.name, "wenchu"); //给stu2的name成员变量赋值。
/*下面是输出结构体的值,注意要指定到基本类型。*/
printf("no.:%hd name:%s sex:%c address:%s\n",stu1.num,stu1.name, \ 
stu1.sex, stu1.addr);
printf("no.:%hd name:%s sex:%c address:%s\n",stu2.num,stu2.name, \ 
stu2.sex, stu2.addr);
return 0;
}


2️⃣✨✨✨结构体数组✨✨✨  

typedef struct student

{

long int num;

char name[20];

char sex;

char addr[20];

 }Student;

现在就可以用它来定义数组,如定义一个一维数组Student stu[5];。这个数组中有5个元素,每个元素都是Student类型。同样地,stu这个数组名的值是一个指针值,指向该数组的第0个元素(Student stu[5];等同于struct student stu[5];)。

与基本类型一维数组一样,可以用顺序下标初始器、受指定的初始化器以及两种的混合对结构体类型的数组进行初始化。例如,

Student stu[5]={{1,"zhang",'M',"Anhui"},{2,"wang",'M',"Henan"}};

Student stu[5]={[1]={1,"zhang",'M',"Anhui"},{2,"wang",'M',"Henan"}};

定义完数组后,要引用它的某个元素的成员变量,可使用“数组变量.成员变量的方式进行。例如要访问数组第0个元素的num成员变量,就可以写成stu[0].num

例利用结构体数组初始化stu1,stu2.

#include <stdio.h>
typedef  struct student
{
  int num;
  char name[10];
  char sex;
  char addr[10];
 }Student;
int main(void)
{
/*定义两个变量结构体变量stu1和stu2,并初值化stu1 */
Student stu[2]={{202018080,"qingyun",'m',"xiaoxian"}, \
{202018081,"wenzhu",'w',"xiaoxian"}};
printf("no.:%d name:%s sex:%c address:%s\n",stu[0].num,stu[0].name, \ 
stu[0].sex, stu[0].addr);
printf("no.:%d name:%s sex:%c address:%s\n",stu[1].num,stu[1].name, \ 
stu[1].sex, stu[1].addr);
return 0;
}


3️⃣✨✨✨指向结构体类型的指针✨✨✨

Student *p;

这里的p是一个地址变量,在一般编译器中占4或8个字节的长度。p指向的空间存放的是Student类型的数据。

指向结构体类型的指针变量在引用结构体的成员变量时,是用“->”来引用,例如,p->num;表示引用p指向的结构体类型数据中的num成员变量。


#include <stdio.h>
typedef struct student
{
long num;
char name[20];
char sex;
float score;
}Student,*Ptr;
int main(void)
{
Student stu={202018080,"qingyun",'m',97.5};
Ptr p; 
p=&stu;
printf("no.:%ld,name:%s,sex:%c,score:%f\n",stu.num,stu.name,stu.sex,stu.score); 
printf("no.:%ld,name:%s,sex:%c,score:%f\n", (*p).num,(*p).name,(*p).sex,(*p).score);
printf("no.:%ld,name:%s,sex:%c,score:%f\n", p->num,p->name,p->sex,p->score); 
return 0;
}

 


4️⃣✨✨✨结构体类型数据作为函数参数✨✨✨

调用函数时,结构体类型的实参把它的所有成员变量的值复制给形参变量。

例10-5-1在main函数中,定义一个结构体变量,输入它的成员值,然后,定义一个函数把这个结构体类型变量的各成员值都输出出来。

#include <stdio.h>
typedef struct student
{
long num;
char name[10];
char sex;
float score;
}Student;
void print(Student stu) //定义结构体类型的形参,接收实参变量值。
{
printf("no.:%ld name:%s sex:%c score:%-5.1f\n", \
stu.num,stu.name,stu.sex,stu.score);
}
int main(void)
{
Student stu1={202018080,"qingyun",97.5};
print(stu1); 
return 0;
}

#include <stdio.h>
typedef struct student
{
long num;
char name[20];
char sex;
float score;
}Student,*S; //定义了一个指针类型别名
void print(S p)  //一个指向结构体类型的指针变量作为形参。
{
	printf("no.:%ld\nname:%s\nsex:%c\nscore:%f\n", \
p->num,p->name,p->sex,p->score);
}
int main(void)
{
  Student stu_1={89101, "lilin",'m', 89.5};
  	print(&stu_1);  //把变量stu_1的地址复制给形参p。
	return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值