学无止境,多多重复,百炼成钢
目录
前言
一、结构体是什么?
结构体是一种构造类型,它由若干成员组成的。其成员变量的类型可以是一个基本结构类型,也可以是一个构造类型。在我的理解中可以将结构体和数组类比成一个仓库,结构体这个仓库可以承装各种各样的货物,这种货物可以不一样,可以一样。而数组这个仓库不一样了,它必须储存一种货物,且对于货物类型有严格要求。
二、声明一个结构体
声明结构体时使用的关键字时struct,一般形式如下
struct 结构体名
{
成员列表
}; //这的分号别忘了
成员列表是构成结构体的成员,也就是一般形式中的成员列表处。
具体应用
struct Product
{
char cName[10]; //产品名称
char cShape[20]; //形状
char cColor[10]; //颜色
char cFunc[20]; //功能
int iPrice; //价格
char cArea[20]; //产地
};
此代码声明了一个Product的结构体类型,这些结构体变量表明了一个商品的名称、形状、颜色、功能、价格和产地。可以根据结构体成员中不同的作用选择与相对应的类型。
三、结构体变量的声明
1.先声明结构体类型,在定义变量。
例如
struct Product product1;
struct Product producy2;
struct Product 是结构体类型名,product1和pronduct2是结构体变量名,二者具有相同的结构。
2.声明结构类型时,同时定义变量。
例如
struct 结构体名
{
成员列表;
}变量列表;
3.直接定义结构体类型表示变量
struct
{
成员列表
}变量名列表;
四、结构体变量的引用
如果要对结构体变量进行赋值、存取或运算,实质就是对结构体成员进行操作。例子
结构体变量名.成员名
结构体变量的成员可以像普通变量一样,进行各种运算。
例如
struct Product .name=10;
五、结构体类型的初始化
结构体类型与其他基本类型一样,也可以在定义结构体变量时指定初始值。
struct Student
{
char cName[20];
char cSex;
int iGrade;
}student1={"hanxue","w",3}; //定义变量并设置初始化
六、结构体数组
定义一个结构数组的方式与定义一个结构体数组的方式一样,只是将结构体变量替换成数组,一般形式如下:
struct 结构体名
{
成员列表
}数组名:
这种定义表明了该结构体中包含了N个元素,一个元素内包含了成员列表内的内容。
也可以
struct 结构体名 数组名;
第三种方式
struct
{
成员列表
}数组名;
另外需要注意的在此元素中的数组内的内存是连续的。
结构体内存是由内部成员类型的最大字节类型决定。
七、结构体数组的初始化
一般形式
struct 结构体名
{
成员列表
}数组名={“初始化列表”};
具体例子
struct Student //学生结构体
{
char cName[20]; //姓名
int Number; //学号
char sex; //性别
int Grade; //年级
}strudent[3]={{“wangwu",15,'m',3},
{"zhangsan",16.'w',2},
{"lisi",14,'m',5} };
八、结构体指针
1.指向结构体变量的指针
定义结构体指针的一般形式如下:
结构体类型 *指针名
引用
假设定义一个指向struct student 结构类型的pStruct指针
struct Student *pstruct;
第一种引用方式:是使用点运算符引用结构体成员
(*pStruct).成员名
注意:这个地方需考虑优先级问题,点运算符优先级最高,所以必须使用括号。
第二种引用方法:使用指向运算符引用。
pStruct->成员名
2.指向结构体数组的指针
结构体指针变量也可以直接指向结构体数组中的元素,这时指针变量的值就是该结构体数组元素的首地址。
例如:
/*例如定义一个结构体数组student[5],使用结构体指针指向该数组*/
struct Student *pStruct;
pStruct=strudent;
如果想利用指针指向数组中的特定元素则需要在数组名前使用取地址符号&,例如
pStruct=&student[2];
九、结构体作为函数参数
1.使用结构体变量作为函数参数
使用结构体变量作为函数的实参时,采取“值传递”方式,即会将结构体变量所占内存单元的内容全部顺序传递给形参,形参也必须是同类型的结构体变量。例如:
void Display (struct Student stu);
此方式缺点是在进行函数传参时,形参也要占用内存单元,会造成一个问题就是。如果在函数内部修改变量中成员的值,返回值不会返回到主函数中。
2.使用指向结构体变量的指针作为函数参数
在传递结构体变量的指针时,只是将结构体变量的首地址进行传递,并没有将变量的副本进行传递
例如
void Display(sturct Student *stu)
此种方式使用形参stu指针来引用结构体变量中成员,这里时传递的变量的地址,如果改变函数中成员数据,则返回主函数变量也会发生改变。
具体例子
#include<stdio.h>
#include<string.h>
struct student
{
int num;
int age;
int sco;
char sex[20];
char nam[32];
char add[32];
}student={15,25,98,"man","niuchen","gansu"};
void Display(struct student *stu)
{
printf("输出结构体成员内容\n");
printf("num=%d\n",stu->num);
printf("age=%d\n",stu->age);
printf("sco=%d\n",stu->sco);
printf("sex=%s\n",stu->sex);
stu->num=60;
}
int main()
{
struct student *stu=&student;
Display(stu);
printf("改变后的值=%d\n",stu->num);
return 0;
}
运行结果
3.使用结构体变量的成员作为函数参数
使用这种方式为函数传递参数与普通的变量作为实参是一样的,是值传递
Display(student.name[0]):
十、包含结构的结构体成员列表
结构体的成员变量不一定是基本类型,也可以是结构体类型,例如物品,定义一个学生信息的结构体类型,其中包含姓名,学号,性别,出生日期。其中出生日期又属于一个结构体类型,里面包括年,月,日三个变量,所以这个就是包含结构的结构。
具体例子
#include<stdio.h>
struct date
{
int year;
int month;
int day;
};
struct student
{
char name[20];
int num;
char sex;
struct date birthday;
}student={"李四",18,'m',{2000,5,5}};
int main()
{
printf("输出结果\n");
printf("姓名=%s\n",student.name);
printf("年龄=%d\n",student.num);
printf("性别=%c\n",student.sex);
printf("生日=%d年%d月%d日\n",student.birthday.year,student.birthday.month,student.birthday.day);
return 0;
}
结果
总结
以上可能就是结构体的基本全部内容了,如果有缺失的欢迎提出,如有错误的地方,希望大家提出,共同学习。