C语言理解——结构体struct

结构体类型

结构体类型属于一种非基本数据类型的 “私人定制” 新类型,它的尽头就是由基本数据类型组成。

1、由来

有一个家教老师开始招生辅导学生学习,来了一个学生,可以一对一辅导,老师这样记录学生信息(名字,学号,年龄)。

char name[] = "jiemu";
char id[]="1068";
int age = 10;

挺简单,这样记录OK啦。又来两个学生,用同样的方法记录学生信息。

char name1[] = "jiemu";
char id[]="1069";
int age = 11;

char name2[] = "bulu";
char id[]="1068";
int age = 10;

char name3[] = "kaidi";
char id[]="1070";
int age = 9;

老师讲得太好了,一下子增加20个学生,一想到这样记录信息,头真大。有没有更好的办法啊???

有的,用结构体就可以轻松解决烦恼。每个学生的信息类型是一样的,把信息放到一个结构体里管理,就方便多了。

struct _student
{
	char name[10];
	char id[10];
	int age;
};
struct _student stu1,stu2,stu3......,stu20;

2、定义

结构体是一种新的类型,属于“私人定制”类型,顾名思义,你想怎么定义就怎么定义。

如何定义一个结构体:

struct  结构体名
{
	成员1;
	成员2;
	......
	成员n;
};

提示:成员可以是基本的数据类型,指针,数组或其他结构类型

结构体里的成员的类型可以是基本数据类型,指针,数组,其它结构体类型。

既然它是类型,就可以定义变量。

学生类可以看作是一种结构体类型,学生实体可以看作是该类型的变量,变量本身的特性就是成员。

怎么判断该类型是结构体类型?

1、必须有struct这个关键字。

2、有结构体名(可以省略)。

3、最后有一个分号。

3、大小

结构体类型在定义的时候并不占内存,而是在定义结构体变量后才占用内存。
那么一个结构体变量占多大内存呢?

方法很简单,除了跟最占内存的基本数据类型成员有关,还跟结构体类型中的成员定义顺序有关。

结构体变量的大小 = “ 最大基本数据类型成员所占字节 ” 的整数倍

通俗理解:把类型看成一个矩形模具,把变量的成员放进模具里,直到放完为止,最终模具大小就是变量的大小了。

下文的代码采用Dev-C++软件测试,使用MinGW GCC 32位的编译器。

基本数据类型的长度与操作系统有关,如:
int类型在32位系统占 4字节,在64位系统占 4或8字节。
long类型在32位系统占 4字节,在64位系统占 8字节。

#include <stdio.h>

int main(void)
{
	printf("sizeof(char) = %d\n", sizeof(char));
	printf("sizeof(int) = %d\n", sizeof(int));
	printf("sizeof(unsigned int) = %d\n", sizeof(unsigned int));
	printf("sizeof(short) = %d\n", sizeof(short));
	printf("sizeof(unsigned short) = %d\n", sizeof(unsigned short));
	printf("sizeof(long) = %d\n", sizeof(long));
	
	return 0;
 } 

运行结果:
sizeof(char) = 1
sizeof(int) = 4
sizeof(unsigned int) = 4
sizeof(short) = 2
sizeof(unsigned short) = 2
sizeof(long) = 4

struct _map
{
	char a; //成员1
	unsigned char c;  //成员2
	short b;  //成员3
	long d; //成员4
};

在这里插入图片描述

struct _map
{
	char a; //成员1
	long d;  //成员2
	short b;  //成员3
	unsigned char c;  //成员4
};

在这里插入图片描述
其它情况成员的变量占用字节数。
在这里插入图片描述

#include <stdio.h>

struct stt
{
	char c_var1;
	int i_var;
	char c_var2;
};
int main()
{
	struct stt sd = { 'c',8,'c' };
	printf("%d\n", sizeof(sd));//12
	return 0;
}

运行结果输出:12 
#include <stdio.h>

struct stt
{
	char c_var1;
	char c_var2;
	int i_var;
};
int main()
{
	struct stt sd = { 'c','c',8};
	printf("%d\n", sizeof(sd));//8
	return 0;
}

运行结果输出:8

结构体的实践

变量需要先定义,再使用。在定义的同时可以初始化变量。

1、初始化

结构体变量初始化就是给每个成员合理地赋值。
在这里插入图片描述
赋的值一定要与成员的类型一致,否则编译不成功。
在这里插入图片描述

2、嵌套结构体

前面提到结构体成员可以是其它结构体变量。

#include <stdio.h>

struct date
{
	int hour;
	int min;
	int sec;
};

struct task
{
	char c_des[10];
	char c_name[8];
	struct date times;
};
int main()
{
	struct task today = {"July","shenz",12,30,50};
	return 0;
}

运行查看成员的值。
在这里插入图片描述

访问成员

内容持续补充中…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值