A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

<结构体>

是什么:
是一种数据类型,是构造类型,里面可以存放不同类型的数据;

有什么用:
用于封装不同的数据类型到一个结构中,方便使用;

定义:
1).定义结构体类型 struct 结构体类型{数据类型1 名称;数据类型2 名称.......};
    struct Person(){
         char *name;
         int age;
    };
2).定义结构体变量及赋值:struct 结构体类型 变量名={数据1,数据2};
    struct Person p1={"liuchuan",26};
    取值:变量名.结构体元素变量名;
    p1.name=
    赋值:变量名.结构体元素变量名=新值;
    p1.age=18;

什么时候用:
当需要把相关联的不同数据类型封装起来一起使用;

有什么特点?
1).可在定义结构体类型时同时定义结构体变量名,可定义匿名类结构体;
2).同一作用域内不可重复定义结构类型和结构变量,匿名类型结构体除外
3).可再函数内也可在函数外,效果及用法类似于局部变量和全局变量,也可嵌套定义
4).可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如此

结构体练习

#include <stdio.h>
int main (){
    //第一种定义方式,定义一个结构体类型,结构体变量名为per1
    struct Person{
   
        char *name;
        int age;
        char *sex;
    };
    //定义一个结构体变量 per1并初始化赋值
    struct Person per1={"liuchuan",26,"男"};
   
    //第二种定义方式,定义结构体类型同时,定义了结构体变量,初始化赋值
        struct Person1{
   
            char *name;
            int age;
            char *sex;
        }per1={"liuchuan",26,"男"};//不可以定义之后,在批量赋值;
   
        //第三种,匿名结构体,结构体类型一样,结构体元素变量和结构体一起定义可以使用,不能分开
        //必须同时初始化变量,这种结构定义方式,不能重用;--不推荐使用,了解
        //什么时候使用,在一次性使用的时候,因为这种方式每次定义结构体变量都要把结构体结构写一遍
        struct {
                char *name;
                int age;
                char *sex;
            }per2={"liuchuan",26,"男"};
            //struct per={}; 错误
            //per={};错误
   
   
   
   
    //打印结构体元素per1内的值
    printf("姓名=%s\n年龄=%d\n性别=%s\n\n\n",per1.name,per1.age,per1.sex);
   
    //修改结构体元素per1的值
    per1.name="chuanchuan";
    per1.age=16;
    per1.sex="女";
   
    //修改后打印
    printf("修改后:\n\n姓名=%s\n年龄=%d\n性别=%s\n",per1.name,per1.age,per1.sex);
   
}

         
      7.  全局变量和局部变量
           1).可再函数内也可在函数外,效果及用法类似于局部变量和全局变量,也可嵌套定义
           2).可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如
     
      8.  匿名结构体:
     什么时候使用,在一次性使用的时候,因为这种方式每次定义结构体变量都要把结构体结构写一遍
      
      9.结构体可以嵌套练习
    struct a{
        int a1;
        int a2;
        int a3;
    };  
    struct b{
        int b1;
        int b2;
        struct a b3;
    }bb={1,2,{1,2,3}};
    printf("%d,%d,%d",bb.b1,bb.b2,bb.b3.a1);





    <结构体数组>

1.是什么?
   是数组,数组里的每一个元素是结构体类型;

2.有什么用?
   用于存档多个有关联的结构体;

3.怎么用?
   定义及初始化:
   struct 结构体类型 数组名[长度]={结构体1,结构体2};
   如:struct person{char *name;int age;};
       struct person per1={};
       struct person per2={};
       struct person arr[2]={per1,per2};
   
        取值,数组名[脚表] arr[0].name=  /arr[1].name=
        赋值.数组名[角标] arr[1].name="liuchuan";

4.什么时候用?
   当需要存储多个有关联的结构体,并作为一个整体使用时;

5.有什么特点
   遵循数组的特点;



<结构体指针>

1.是什么?
   是指针,指针类型的结构体类型;

2.有什么用?
   用于存储结构体的地址,,并操作地址对应的结构体空间内的数据;

3.怎么用?
   定义及初始化赋值
   struct 结构体类型 *指针名 =&结构体变量;
   struct person
   {
     char *name;
     int age;
   };
   
   struct person per1={"刘川",26};
   struct person *p=&per1;
  
    取值:*指针名.结构体元素名;
            指针名->结构体元素名;
   (*p).name=%s
   p->name=%s
   
     赋值:*指针名.结构体元素名;
              指针名->结构体元素名;
              (*p).name="liuchuan";
              p->age=25;

4.什么时候用?
   当需要使用指针操作结构体时;
         
5.特点:
   指针移动对结构体本身没有意思,结构体名并不包含第一个元素的地址;(可以使用->小箭头)

6.结构体元素指针:
   struct person
   {
     char *name;
     int age;
   };
   
   struct person per1={"刘川",26};
   struct person *p=&per1;
   
   结构体元素指针定义:
   int **p1=&per1.name;
   int *p2=&per.age;


7.结构体内存分析

   -->结构体分配内存空间遵循的2各原则-对其原则,或对其算法(增加CPU寻址效率)
   1).每个元素的偏移量(当前元素首地址距离整个结构体首地址的字节数)必须是自己所占字节数的整数倍,如果不够,补齐上一个元素的字节数;
   2).整个结构体的字节数必须是其最大元素所占自己的整数倍,如果不够,最后一个元素填充字节;
   3).计算结构体sizeof(struct 结构体类型)-->sizeof(struct person);

8.结构体编程题

编程题1;
#include <stdio.h>
int main(){
    struct Car {
        char *pinPai;
        int wheel;
        int speed;
        char *color;
    }car1={"BMW",4,250,"白色"};
   
    struct Car car2={"大众",3,120,"屎色"};
   
    //第一种方式输入打印
   
    printf("\n汽车品牌是-->%s\n轮子个数-->%d\n速度为-->%d\n颜色为-->%s\n\n",car1.pinPai,car1.wheel,car1.speed,car1.color);
   
    //指针方式打印
    struct Car *p=&car2;
   
    printf("\n汽车品牌是-->%s\n轮子个数-->%d\n速度为-->%d\n颜色为-->%s\n\n",(*p).pinPai,(*p).wheel,(*p).speed,(*p).color);
   
    printf("\n汽车品牌是-->%s\n轮子个数-->%d\n速度为-->%d\n颜色为-->%s\n\n",p->pinPai,p->wheel,p->speed,p->color);
   
}



编程题2-3:
#include <stdio.h>
int main(){
    //定义一个结构体,用于保存家庭成员姓名,年龄,身份;
    struct Family{
   
        char *name;
        int age;
        char *ffname;
    }family01,family02;
    //第一种赋值
    family01.name="冰";
    family01.age=26;
    family01.ffname="哥哥";
   
    //定义一直指针赋值
    struct Family *f1=&family02;
   
    f1->name="洁";
    f1->age=16;
    f1->ffname="姐姐";
   
    //普通打印成员信息
    printf("\n-->%s\n-->%d\n-->%s\n",family01.name,family01.age,family01.ffname);
   
    //指针方式打印成员信息
    printf("\n-->%s\n-->%d\n-->%s\n",(*f1).name,(*f1).age,(*f1).ffname);
}


3 个回复

正序浏览
总结的不错,很详细,感谢分享
回复 使用道具 举报
这帖蛮长的,来赞一个..
回复 使用道具 举报
666666666666啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马