结构体和共用体

数组只能存放相同类型,而一个事物的属性不一定是相同类型,比如树木的年龄和类型,此时需要用到结构体。默认值传递
封装事物特征

#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);

        }
        
    }
         

}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值