前言
- 本博文基于VC++6.0开发调试运行;
- 本博文知识对结构体的一个简介;
什么是结构体
一般的变量定义都是独立的,变量与变量之间或许有联系,比如记录一个人的个人信息(身高,体重,年龄等)时需要定义分别几个变量,并且调用时需要分别调用;但是这种对于个人信息的统计方式,并不适合大型程序的编写,如果能有一个东西,把这些信息都包裹在一个块儿内,谁用调取,那么想必会很方便;结构体的功能就是做这个工作的;它用来把有联系的一些变量定义在一起,调用的时候,可以集中调用;
**说明:**结构体是结构体,结构体变量是结构体变量;结构体是一个数据类型,结构体变量是一个变量;
#include <stdio.h>
void main()
{
//普通变量:分散个人信息
char name[] = "ZhangSan";
int high = 188;
int weight = 100;
//结构体:包裹个人信息;
struct Student
{
char name[9];
int high;
int weight;
};
}
结构体的定义
struct 结构体名
{
/*
成员列表(别名:子项/域表)
*/
};
注意:
- 结构体类型并不像整型那样就一个关键字符号int,而是由关键字struct 和结构体名一块形成结构体数据类型;
- 区分俩个不同类型结构体,是通过结构体名来区分的;并且,结构体名是结构体名,结构体变量名是结构体变量名;
例如:
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;
};
- 定义结构体时,编译器并没有为其分配存储空间,只有定义结构体变量的时候,系统才会分配内存空间;
- 结构体可以嵌套结构体;
定义结构体类型变量(三种方式)
方式一:先声明结构体类型,再定义该类型的变量
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,就是指向下一个结构体,这是指针变量的基本运算法则;