结构体

结构体类型

结构体是一种较为复杂但却很灵活的构造型数据类型。一个结构体类型可以由若干个称为成员的(或域)的成分组成。

结构体类型说明

其一般形式:
struct 结构体标识名
{ 类型名1 结构成员名表1;
类型名2 结构成员名表2;
.
类型名n 结构成员名表n;
};
其中struct是关键字,是结构体类型的标志。“结构体标识名”和“结构成员表”都是用户定义的标识符。
注意:结构体说明同样要以分号结尾
举例:

struct date
{int year,month,day;};//其实我不是很喜欢这样写因为我会容易漏掉day后的;

我喜欢这样写,

struct date
{
int year,month,day;
}

结构体类型说明中的“类型名1”——“类型名n”,不仅可以是简单数据类型,也可以是构造类型,也可以是某种结构体类型。
当结构体说明中又包含结构体时,称为结构体的嵌套。ANSI C 标准规定结构体至少允许嵌套15层(并且允许内嵌结构体成员的名字与外层成员的名字相同)。
举例

struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
};

举例

struct student
{
	char name[12];
	char sex;
	struct
	{
		int year;
		int month;
		int day;
	}birthday;
	float sc[4];
};

结构体类型的说明只是列出了该结构的组成情况,标志着这种类型的结构“模式”已存在,编译程序并没有因此而分配任何储存空间。真正占有存储空间的仍应是具有相应结构体类型的变量、数组以及动态开辟的存储单元,只有这些“实体”才可以用来存放结构体的数据。因此,在使用结构体变量、数组或指针变量之前,必须先对这些变量、数组或指针变量进行定义。

结构体类型的变量、数组和指针变量的定义

可以用以下四种方式定义结构体类型的变量、数组和指针变量:

  1. 紧跟在结构体结构体类型说明之后进行定义,例如:
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
}std,pers[3],*pstd;

此处在说明结构体类型struct student 的同时,定义了一个结构体变量std、具有3个元素的结构体数组pers和基类型为结构体类型的指针变量pstd。

  1. 在说明一个无名结构体类型的同时,直接进行定义,例如:(以上定义的结构体中可以把student 略去)
struct
{
...
}std,pers[3],*pstd;
  1. 先说明结构体类型,再单独进行变量定义。例如:
struct student
{
...
};
struct student std,pers[3],*pstd;

注意:作为构造类型,属于struct类型的结构体可以有任意多种具体的"模式"因此struct必须与结构体标识名共同说明不同的结构体类型,此外,不能只写结构体标识名而省掉struct。

  1. 使用typedef 说明一个结构体类型名,再用新类型名来定义变量。例如:
typedef struct
{
	char ame [12];
	char sex;
	struct date birthday;
	float sc[4] 
}STREC;
STREC std,pers[3],*pstd;

STREC是一个具体的结构体类型名,它能够唯一地识别这种结构体类型
可用它来定义变量,不可再写关键字struct。

//举例
//统计男女生人数 
#include<stdio.h>
#include<string.h>
struct student//结构体,把这个看成数据类型 
{
   	int sno;
   	char name[20];
  	char sex;
  	int age; 
};
int main()
{
	struct student s[100];
	
	int n;
	printf("请输入需记录的学生人数:\n");
	scanf("%d",&n);
	
	for(int i = 0;i < n; i++)
	{
		printf("\n学号:"); 
	   	scanf("%d",&s[i].sno); 
	   	fflush(stdin);//清空缓存区 
	   	printf("姓名:"); 
	  	gets(s[i].name);
	  	printf("性别(女生请输入F,男生请输入M):"); 
	  	s[i].sex=getchar();
	  	printf("年龄:"); 
	  	scanf("%d",&s[i].age);  
    }
    
    int female = 0;
    int male = 0;
    for(int i = 0;i < n;i++)
    {
    	if(s[i].sex == 'F')
    	{
    		female ++;
		}
		if(s[i].sex == 'M')
		{
			male ++;
		}	
	}
	printf("\n女生人数(female):%d",female);
	printf("\n男生人数(male): %d",male);
	
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值