理解结构体

引入

数组是相同数据的一个集合,如果不同数据的集合呢?---->结构体,结构体可以帮助我们将不同类型的数据集合在一起调用
结构体:
    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);
    }

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不吃牛肉!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值