数组只能存放相同类型,而一个事物的属性不一定是相同类型,比如树木的年龄和类型,此时需要用到结构体。默认值传递
封装事物特征
#include <stdio.h>
void main(){
//创建结构体,结构体是一种数据类型
struct cat{
char *name;//使用指针,指向一个字符串
int age;//年龄
char *color//颜色
}cat3={"呦呦",3,"蓝色"};//也可以整体赋值
struct cat cat1,cat2,cat4;//cat1是一个cat类型的变量
cat1.name="温温";
cat1.age=12;
cat1.color="白色";
cat2.name="想想";
cat2.age=11;
cat2.color="花色";
//cat4={"江江",9,"青色"};赋值方式不可以
struct cat cat5={"江江",9,"青色"};//在定义的时候直接赋值
printf("第一只猫的名字:%s,年龄:%d,颜色:%s\n",cat1.name,cat1.age,cat1.color);
printf("第二只猫的名字:%s,年龄:%d,颜色:%s",cat2.name,cat2.age,cat2.color);
return 0;
}
结构体变量之间是独立的,为每个结构体变量都会独立分配空间,结构变量名指向第一个成员的地址;
匿名结构体没有结构体名称,直接定义结构体变量,
应用
狗的信息,并定义一个函数用字符串输出
#include <stdio.h>
struct Dog{
char *name;
int age;
};
char *say(struct Dog dog ){
static char info[50];
sprintf(info,"name=%s age=%d",dog.name,dog.age);
return info;
}//返回的是函数中自己创建变量对应的结果,就需要用static修饰
int main(){
struct Dog dog={"也也",6};
char *info=NULL;
info=say(dog);
printf("狗的信息:%s",info);
return 0;
}
求立方体体积
#include <stdio.h>
struct Box{
double len;
double wid;
double hei;
double vol;
};
double volume(struct Box box){
box.vol=box.len*box.wid*box.hei;
return box.vol;
}
int main(){
printf("请输入长宽高:");
//double len,wid,hei;
struct Box box;
scanf("%lf %lf %lf",&box.len,&box.wid,&box.hei);
printf("%lf ",box.len);
box.vol=volume(box);
printf("%lf %lf %lf %lf",box.len,box.wid,box.hei,box.vol);
return 0;
}
共用体
定义一个共用体变量,里面的成员共享同一块空间,该空间的大小以占用最大的成员为准。共用体的大小就是最大的成员所占的字节数,最大成员的字节数就是共用体的大小
#include <stdio.h>
union data{//data是一个共同体,包含三个成员,共享数据空间,该空间的大小以占用最大的成员为准
int n;
char ch;
short m;
};
int main(){
union data a;
//sizeof(a):最大的成员所占的字节数
printf("共同体变量a所占的字节数:%d ,int所占的字节数:%d ",sizeof(a),sizeof(union data));
a.n=0x40;//16进制中每一位代表4位:40转成二进制就是0100 0000,因此只占用了一个字节
//字节数从低位开始存放,输出时会以%d十进制的方式输出
printf("n=%d,ch=%c,m=%d\n",a.n,a.ch,a.m);//ch and m 也会有值,因为共享空间,0100 0000对应的ASCII码是@,m占用两个字节,16位,所以跟n的值一样
a.ch='9';//赋值字符9,改变第二个成员的值,字符9在ASCII码表中对应的二进制编码:0011 1001,那么此时会改变原有已经赋给n的值,转成十进制为57
//由于是字符型,所以会对着ASCII码进行转换,由于char类型只占一个字节,所以只有一个自己存放,也是从低位开始存放,所以9对应的ASCII码是22@
printf("n=%d,ch=%c,m=%d\n",a.n,a.ch,a.m);
a.m=0x2033;//short只占两个字节,所以此处只会使用后面两个字节
printf("n=%d,ch=%c,m=%d\n",a.n,a.ch,a.m);
return 0;
}
共用体保存学生,老师的信息,其中姓名,年龄是老师和学生都有的,科目是老师特有的,平均分数是学生特有的
#include <stdio.h>
#define TOTAL 2;
// union ssc{
// float score;
// char course[20];
// }//也可以在外进行定义
struct Person{
char name[20];
int age;
char profession[10];
//设计了一个匿名共用体,sc是一个共用体变量,此变量只用一次
//union ssc s1;
union {
float score;
char course[20];//20更大
}sc;
};
void main(){
int i;
struct Person persons[2];//定义一个结构体数组
for(i=0;i<2;i++){
printf("input information\n");
scanf("%s %d %s",&persons[i].name,&persons[i].age,&persons[i].profession);
if(persons[i].profession=='s'){
printf("请输入学生分数\n");
scanf("%lf",&persons[i].sc.score);
}
else{
printf("请输入老师教授科目\n");
scanf("%s",&persons[i].sc.course);
}
fflush(stdin);//刷新
}
printf("\nName\t\tAge\tProfession\tScore\tCourse\n");
for(i=0;i<2;i++){
if(persons[i].profession=='s'){
printf("%s\t\t%d\t%s\t%lf\t\n",persons[i].name,persons[i].age,persons[i].profession,persons[i].sc.score);
}
else{
printf("%s\t\t%d\t%s\t\t%s\n",persons[i].name,persons[i].age,persons[i].profession,persons[i].sc.course);
}
}
}