C语言结构体

前言

  1. 本博文基于VC++6.0开发调试运行;
  2. 本博文知识对结构体的一个简介;

什么是结构体

一般的变量定义都是独立的,变量与变量之间或许有联系,比如记录一个人的个人信息(身高,体重,年龄等)时需要定义分别几个变量,并且调用时需要分别调用;但是这种对于个人信息的统计方式,并不适合大型程序的编写,如果能有一个东西,把这些信息都包裹在一个块儿内,谁用调取,那么想必会很方便;结构体的功能就是做这个工作的;它用来把有联系的一些变量定义在一起,调用的时候,可以集中调用;

**说明:**结构体是结构体,结构体变量是结构体变量;结构体是一个数据类型,结构体变量是一个变量;

#include <stdio.h>
void main()
{
	//普通变量:分散个人信息
	char name[] = "ZhangSan";
	int high = 188;
	int weight = 100;

	//结构体:包裹个人信息;
	struct Student
	{
		char name[9];
		int high;
		int weight;
	};
}

结构体的定义

struct 结构体名
{
    /*
    成员列表(别名:子项/域表)
    */
};

注意:

  1. 结构体类型并不像整型那样就一个关键字符号int,而是由关键字struct 和结构体名一块形成结构体数据类型;
  2. 区分俩个不同类型结构体,是通过结构体名来区分的;并且,结构体名是结构体名,结构体变量名是结构体变量名;
    例如:
struct Student_1   //结构体类型为Student_1;
{
	char name[10];
	int num;
	int high;
};
struct Student_2  //结构体类型为Student_2;
{
	char name[10];
	int num;
	int high;
	int weight;
};
  1. 定义结构体时,编译器并没有为其分配存储空间,只有定义结构体变量的时候,系统才会分配内存空间;
  2. 结构体可以嵌套结构体;

定义结构体类型变量(三种方式)

方式一:先声明结构体类型,再定义该类型的变量

struct 结构体名 
{
	//成员变量;
};

struct  结构体名  结构体变量名1, 结构体变量名2;

方式二:声明类型的同时定义变量

struct 结构体名 
    {
    	//成员变量;
    }结构体变量名1,结构体变量名2;

这种方式适合放在小程序中,大型的程序适合用方式一;

方式三:不指定类型名而直接定义结构体类型变量

struct 
{
	//成员列表;
} 结构体变量名1,结构体变量名2;

这种方法所用不多,不建议使用;

补充:
1.结构体类型中的成员变量名和程序中的变量名可以是相同的,

结构体变量的初始化和引用

一 直接初始化:(举例说明)

#include <stdio.h>
void main()
{	
	struct Student
	{
		char name[9];
		int high;
		float weight;
	}student_1 = {"zhangsan",100,111.23};  //直接初始化
}

二 先引用,再初始化;

#include <stdio.h>
void main()
{	
	struct Student
	{
		char name[9];
		int high;
		float weight;
	}student_1,student_2;  
	student_1.high = 100;    //引用初始化
	/* 
	只初始化一个结构体成员变量,这种情况下,其他没有被初始化的数值型成员被默认初始化为0,
	字符型成员是‘\0’,指针成员是NULL;
	*/
}

注意:同类结构体之间可以相互赋值;例如上例中,student_1 = student_2;

结构体数组

所谓结构体数组就是指数组的每个元素(str[i])都是一个结构体变量;
定义一个结构体数组:
方式一:

struct  结构体名
{
	//成员列表;
}结构体数组名[i];

方式二:

struct  结构体名
{
	//成员列表;
};
struct 结构体名 结构体数组名[i]

初始化结构体数组:(举例说明)

struct Student 
{
	char name[10];
	int score;
}studentp[3] = {"zhangsan",123,"lisi",234,"zhaowu",345};
或
struct Student studentp[3] = {"zhangsan",123,"lisi",234,"zhaowu",345};

通过一个实例解释说明:

/*输入三个学生的学号,姓名,成绩,并按照从小到大的成绩输出*/
#include <stdio.h>
struct Student
{
	int number;
	char name[10];
	float score;
};
void main()
{
	void rank(struct Student *);
	struct Student student[3];
	printf("请输入三个人的信息:\n");
	int i=0;
	for(;i<3;i++)
		scanf("%d%s%f",&student[i].number,student[i].name,&student[i].score);
	rank(student);
	for(i=0;i<3;i++)
		printf("学号:%d\t姓名:%s\t成绩:%f\t\n",student[i].number,student[i].name,student[i].score);
}
void rank(struct Student *student)
{
	struct Student temp;
	int i=0,j;
	for(;i<3;i++)
	{
		for(j=i+1;j<3;j++)
		{
			if(student[i].score>student[j].score)
			{
				temp = student[i];
				student[i] = student[j];
				student[j] = temp;
			}
		}
	}
}

结构体指针变量

所谓结构体指针变量,就是结构体变量是指针变量,其变量指向结构体所开辟内存的首地址;说到这里要提一下结构体变量的内存情况:声明一个结构体类型时候,编译器不分配内存单元,定义结构体变量的时候分配内存单元,分配的内存大小是各个成员变量所占内存之和,并且所占内存一定是4的倍数,因为计算机对于数据的处理是按字来处理的(1字=4字节);
例如:

struct Student
{
	int number;  //占用4个字节;
	char name[10];//占用10个字节;
	float score;//占用4个字节;
	//所以占用的总字节数是:4+10+4+2 = 20字节;最后的2即使没有数据,也要空出来;
};

定义一个结构体指针变量:

struct 结构体变量名 指针变量;
struct Student *student_p;

开辟的内存如下图:
在这里插入图片描述
举例说明:

#include <stdio.h>
void main()
{
	struct Student
	{
		int number;
		char name[10];
		float score;
	}student = {1001,"wuyuzun",78.0};
	
	struct Student *student_p = NULL;	
	student_p = &student;
	printf("学号:%d\t姓名:%s\t成绩:%f\t\n",(*student_p).number,(*student_p).name,(*student_p).score);
}

运行结果:
在这里插入图片描述

**注意:**在引用结构体指针变量的成员变量时,除了可以用成员运算符’.'之外,还可以使用箭头符号->;
存在如下等价关系:

(*student_p).number  == student_p->number;
(*student_p).name    == student_p->name;
(*student_p).score	 == student_p->score; 

指向结构体数组的结构体指针变量

这个概念并不难理解,其实解释结构体指针指向结构体数组,类似于普通指针指向普通数组,数组名本身就是地址,数组元素本身就可以用指向数组的指针读写;
举例说明:

#include <stdio.h>
void main()
{
	struct Student
	{
		int number;
		char name[10];
		float score;
	}student[3] = {{1001,"wu",78.0},{1002,"yu",78.1},{1003,"zun",78.3}};
	struct Student *student_p = NULL;	
	for(student_p = student;student_p < student+3;student_p++)
		printf("学号是:%d\t姓名是:%s\t成绩是:%f\n",student_p->number,student_p->name,student_p->score);
}

运行结果:
在这里插入图片描述
程序结构如图:
在这里插入图片描述
总结一下:这里体现了指针的算数运算是根据指针本身结构体数据类型;也就是student_p每+1,就是指向下一个结构体,这是指针变量的基本运算法则;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值