结构体的理解及代码实现


结构体

什么是结构体?

答:若干个相同或者不同类型的数据组成的新的类型


定义格式:

struct 结构体名{

    

    成员列表;   //格式: 类型 变量名;

    

};


结构体变量

结构体变量特点:

一个复合类型,具备结构体的特性

struct Stu{

    int age;

}stu1,stu2;



//匿名结构体

struct{

    int model;

}s1; //



//先定义结构体,后定义变量

struct Stu stu3;



结构体变量中成员的访问方法


结构变量名.成员名


点语法

boy1.num             boy1的学号

boy2.sex             boy2的性别

boy1.birthday.month  boy1的生日的月份



初始化结构体变量

初始化的时候,注意成员的顺序


1)定义的同时进行初始化

struct Stu{

    int age;

    char name[20];

    char *name2;

}stu1={23,"sss","xxx"};



2)定义结构体变量的同时初始化

struct Stu{

    int age;

    char name[20];

    char *name2;

}; //以上仅仅只是定义了结构体类型,还没有定义结构体变量


//定义结构体变量

struct Stu stu2 = {23,"sss","xxx"};


3)定义结构体类型同时定义结构体变量后初始化

struct Stu{

    int age;

    char name[20];

    char *name2;

}stu3;


stu3 = {23,"sss","xxx"};  //错误的


1.连续初始化

stu3 = (struct Stu){23,"sss","xxx"}; //正确



2.逐个初始化

stu3.age = 1;

strcpy(stu3.name,"xxx");   //为什么要使用strcpy这个方法,直接赋值可以吗?

stu3.name2 = "xxx";


区分一个细节:

struct Stu{

    char name[20];        //字符串数组

    char *name2;          //字符串指针

}stu1;


stu1.name = "xxx" ;             //错误的

strcpy(stu1.name,"xxx");        //正确的  通过strcpy方法

stu1.name2 = "xxx"              //正确


//定义同时进行初始化  严格遵守定义顺序



//部分初始化

struct Stu{

    int age;

    char name[20];

};

方式一:struct Stu boy1={.name="weige"};

方式二:struct Stu boy1;

boy1.age = 10;



结构体的数组

定义:由相同类型的结构体变量组成的有序的集合。


定义格式:

1) 定义结构体的同时定义结构体数组

struct Car{

    int lunzi;

    int speed;

}cars[5];


2) 使用匿名结构体定义数组

struct {

    int lunzi;

    int speed;

}cars[5];


3)先定义结构体类型,再定义结构体数组

struct Car{

    int lunzi;

    int speed;

};

struct Car cars[5];


初始化:

1) 定义结构体数组的同时进行初始化

struct Car{

    int lunzi;

    int speed;

    char *name;

}cars[2]={{2,50},{80,300}};



2)方式二

struct Car{

    int lunzi;

    int speed;

    char *name;

};

struct Car cars[2]={{2,50},{80,300}};


3) 匿名

struct {

    int lunzi;

    int speed;

    int speed;

}cars[2]={{2,50},{80,300}};



4)先定义结构体数组,后初始化

struct Car{

    int lunzi;

    int speed;

    char *name;

}cars[3];

cars[0].lunzi = 4;

cars[0].speed = 200;

cars[0].name="xxxx";



通过数组角标整体去初始化 cars[1]=(struct Car){6,100};



结构体指针

定义:指向结构体的指针

格式:结构体类型 * 结构体指针变量名;

struct Student stu1;    //结构体变量

struct Student *pstu;   //结构体指针

pstu = &stu1;


作用:可以间接访问结构体变量中保存的成员变量值


(*pstu).name

(*pstu).sno 新的访问方法

pstu->name  // 只有结构体指针变量才可以

等价于 (*pstu).name



结构体作用域

跟变量作用域用法一样  就近原则


结构体存储空间

结构体在内存中占用的存储空间是 所有元素占用空间之和(考虑对齐)

1.逐个元素对齐(下个元素与之前所有元素之和对齐)

2.整体对齐(最后的和能单独整除所有元素)-->  最后能整除最长类型



结构体基本用法:

#include


int main(){

    

   

    

    

   

    

    struct Person{

        char *name;

        int age;

        

    };

    

    // 2.定义结构体变量及赋值: struct 结构体类型 变量名={数据1,数据2….};

    struct Person p1={"itheima",18};

    

    //使用

    

    //取值:变量名.结构体元素变量名;赋值:变量名.结构体元素变量名=新值;

    printf("name=%s---age=%d\n",p1.name,p1.age);

    

    //赋值:变量名.结构体元素变量名=新值;

    p1.name="itcast";

    p1.age=20;

    printf("name=%s---age=%d\n",p1.name,p1.age);

    

        return 0;

 

}



结构体特点:


#include


int add();


int main(){

    

   

    

    

    

   

    

    

   

    

    

   

    

    

   

    

    

   

    

    

   

    

    

    //struct Person per2={"itcast",19};

    add();

    

    return 0;

}


 

struct Person{

    char *name;

    int age;

    int a;

};


struct Person per1={"heima",19,8};



 



int add(){

    

    struct Sun{

        char *name;

        int age;

        

    };

    

   

    struct Person{

        char *name;

        int age;

        struct Sun baby;

        

    };

    

    struct Person per1={"heima",19,{"baby",1}};

    printf("name=%s--age=%d--a=%d\n",per1.name,per1.age,per1.baby.age);

    

   // printf("name=%s--age=%d--a=%d\n",per1.name,per1.age,per1.a);

    

    return 0;

    

}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值