引入
数组是相同数据的一个集合,如果不同数据的集合呢?---->结构体,结构体可以帮助我们将不同类型的数据集合在一起调用
结构体:
struct 结构体名{
成员列表
};
例如:
struct student{
int ID;
char name;//成员名
};
注意:
1.结构类型与结构变量时两个不同的概念,其区别如同int类型与int型变量的区别一样.
如:int x =10; //x是int型变量
struct student stu; //stu是结构变量, struct student是结构类型
2.结构类型中的成员名,可以与主程序中的变量同名,他们代表不同的对象,互不干扰
如: int main(){
int ID=10;
char name='a';//这里不会和上面的结构体发生冲突,和函数形参,实参一样
}
3.结构类型中的数据项,既可以是基本数据类型也可以是结构体类型
结构体的使用
1.在使用结构体时,需要在主函数定义结构变量;
struct student{
int ID;
char name;//成员名
};
int main(void){
struct student stu;//定义结构体的变量
stu.ID=666;//对成员进行赋值
stu.name='d';
//或者(另外一种定义方法)
struct student stu ={10,'d'};//包括定义,和按顺序赋值
return 0;
}
另外一种定义方法:
struct student{
int ID;
char name;//成员名
}stu;//直接在结构体末尾分号前定义结构体变量,可以多个表示定义多个结构变量
int main(void){
stu.ID=666;//对成员进行赋值
stu.name='d';
return 0;
}//在结构体定义结构变量后,就不需要在主函数定义结构变量名,直接调用就好了
2.语言中关键字typedef可以为数据类型定义一个别名.
如有:typedef int fun;
则标识符fun就是int的一个别名,两者可以互换使用(意思时定义整型变量时既可以用int,也可以用fun)
也就是说fun具有int的能力,相当一个整型类型
在结构体中使用typedef:
typedef struct student{
int ID;
char name;//成员名
};//这样使用是没有意义的,因为struct student是结构类型,这个地方缺少一个变量
这样使用就可以:
typedef struct student{
int ID;
char name;//成员名
}stu;//这里的struct student和stu都是结构类型,这里的stu就不属于结构变量了,也就是说需要定义结构变量
int main(){
stu stt;//定义结构变量,结构变量为stt
struct student stt;//和上面的定义效果一样
}
结构体指针
通过指针结构变量的指针来访问结构变量的成员,与直接使用结构变量的效果一样.一般来说,如果指针变量pointer已指向结构变量var,则以下两种形式等价:
(1) var.成员 //分量运算符 '.'
(2) pointer->成员 //指针运算符 '->'
typedef struct student{
int ID;
char name;//成员名
}stu;
int main(){
stu stt;
stt.ID=666;
//使用指针
int *pointer=&stt;//pointer是指针变量
pointer->ID=555;//使用指针访问结构变量的成员
}注意:
(1)分量运算符左侧的运算对象,只能是结构变量,不能是指针
(2)指针运算符左侧的运算对象,只能是指向结构变量(或结构数组)的指针变量,否则都出错.
结构体数组:
结构体数组就是数组里面存放的是结构体
例如:
struct student{
int ID,age;
}sut[10];//这里定义了10个结构体,每个结构体里面的成员都是一样的
//就像是将一个结构体进行复制粘贴
//使用
int main(){//赋值方式
stu[0].ID=10;//第一个结构体的成员赋值
stu[1].ID=10;
stu[2].ID=10;
stu[3].ID=10;
stu[4].ID=10;//第四个结构体的成员赋值
return 0;
}
引用时出现的笔记
1.strcpy(j1.name,"pink大大");
//用strcpy函数可以引用复杂的符号充当成员变量的值
2.在需要同时定义多个引用相同结构体的元素时,我们可以利用函数,节约代码量;
还有在打印输出时我们也可以用函数进行打印输出如:
struct juese
{
int level;
char name[20];
char sex; //m 男
int power;//攻击力
int blood;//血量
float mingzhong;//命中
};//创建一个结构体
//利用函数定义结构变量,可节约代码
//j是结构变量得名字,l表示等级,表示性别,p表示攻击力,b表示血量,m表示命中率
void init(juese *j, int l, char *n, char s, int p, int b, float m)
{
j->level = l; //指针结构变量的指针j来访问结构变量的成员level
j->sex = s;//指针结构变量的指针j来访问结构变量的成员sex
j->power = p;//指针结构变量的指针j来访问结构变量的成员power
j->blood = b;//指针结构变量的指针j来访问结构变量的成员blood
j->mingzhong = m;//指针结构变量的指针j来访问结构变量的成员mingzhong
strcpy(j->name,n);//指针结构变量的指针j来访问结构变量的成员name
}void show(juese*j);//函数声明(打印输出的声明,因为函数在主函数下面)
int main(void)
{
juese j1, j2; //定义结构变量
init(&j1,11,"欧震",'m',1000,100,0.5f);//需要取结构变量的地址,否则无法赋值
init(&j2,11,"欧",'m',1000,100,0.5f);
show(&j1);
show(&j2);//因为是指针需要取地址}
//函数输出
void show(juese*j){//写完就可以调用了,又因为这个函数在主函数的下面所以要进行声明函数
if(j->sex=='m'){
printf("这是一个%d级的%s,性别男,攻击力%d,血量%d,命中率%g\n",j->level,j->name,j->power,j->blood,j->mingzhong);
}
else if(j->sex=='f'){
printf("这是一个%d级的%s,性别女,攻击力%d,血量%d,命中率%g\n",j->level,j->name,j->power,j->blood,j->mingzhong);
}
}