结构体

结构体的基本用法及特点

结构体:

       是一种数据类型,是构造类型,里面可以存放不同类型的数据.

       用于封装不同的数据类型到一个结构体中,方便使用.

 
 
  1. #include <stdio.h>
  2. int main() {
  3.    //定义结构体
  4.    struct Person{
  5.        char* name;
  6.        int age;
  7.    };
  8.    //定义结构体变量及赋值:
  9.    struct Person p1={"itheima",18};
  10.    //取值:
  11.    printf("name=%s---age=%d\n",p1.name,p1.age);
  12.    //运行结果:name=itheima---age=18
  13.    //赋值:
  14.    p1.name="itcast";
  15.    p1.age=20;
  16.    printf("name=%s---age=%d\n",p1.name,p1.age);
  17.    //运行结果:name=itcast---age=20
  18.    return 0;
  19. }

特点:

       1.可以定义结构体类型时同时定义结构体变量名,可定义匿名类型结构体.

       2.同义作用域内不可重复定义结构体类型和结构变量,匿名类型结构体除外.

       3.可在函数内也可在函数外,效果及用法类型于局部变量和全局变量,也可嵌套定义.

       4.可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如此.

 
 
  1. #include <stdio.h>
  2. int main() {
  3.    //基本的定义方式
  4.    struct Person{
  5.        char* name;
  6.        int age;
  7.    };
  8.    struct Person per={"itcast",20};
  9.    //第二种定义方式:
  10.    struct Person1{
  11.        char *name;
  12.        int age;
  13.    }per1={"itheima",18};
  14.    //第三种定义方式:
  15.    struct Person2{
  16.        char *name;
  17.        int age;
  18.    }per2;
  19.    per2.name="zhangxue";
  20.    per.age=19;
  21.    //错误一:
  22. //    struct Person2{
  23. //        char *name;
  24. //        int age;
  25. //    }per2;
  26. //    per2={"itheima",19};      //错误:与数组一样,不可以批量赋值
  27.    //错误二:
  28. //    struct {                  //错误
  29. //        char *name;
  30. //        int age;
  31. //    };
  32. //    struct per={"ithemia",45};
  33.    //第四种方式:匿名类型结构体(注意必须同时初始化变量)
  34.    //这种结构体定义方式不能重用
  35.    struct {
  36.        char *name;
  37.        int age;
  38.    }per3={"itheima",45};
  39.    return 0;
  40. }


结构体的数组的用法

结构体数组:

       是数组,数组的每一个元素都是结构体类型

       存储多个有关连的结构体

 
 
  1. #include <stdio.h>
  2. int main() {
  3.    //定义:
  4.    struct Person{
  5.        char *name;
  6.        int age;
  7.    };
  8.    struct Person per={"itheima",12};
  9.    struct Person per1={"heima",46};
  10.    struct Person arr[2]={per,per1};
  11.    //取值:
  12.    printf("%s----%d\n",arr[0].name,arr[0].age);
  13.    //运行结果:itheima----12
  14.    return 0;
  15. }


结构体与指针的关系

结构体指针

        是指针,指针类型是结构体类型.

        用于存储结构体的地址,并操作地址对应的结构体空间的数据

 
 
  1. #include <stdio.h>
  2. int main() {
  3.    //定义:
  4.    struct Person{
  5.        char *name;
  6.        int age;
  7.    };
  8.    struct Person per={"itheima",12};
  9.    struct Person *p=&per;
  10.    //操作:
  11.    //取值:
  12.    printf("%s----%d\n",(*p).name,(*p).age);
  13.    printf("%s----%d\n",p->name,p->age);
  14.    //运行结果:
  15. //    itheima----12
  16. //    itheima----12
  17.    //赋值方式:两种
  18.    //第一种:
  19.    p->name="itcast";
  20.    p->age=3;
  21.    printf("%s----%d\n",(*p).name,(*p).age);
  22.    //运行结果:itcast----3
  23.    //第二种:
  24.    (*p).name="zhangxue";
  25.    (*p).age=45;
  26.    printf("%s----%d\n",(*p).name,(*p).age);
  27.    //运行结果:zhangxue----45
  28.    return 0;
  29.    
  30. }

特点:

        指针移动对结构体本身没有意义,结构体名并不包含第一个元素的地址.

 
 
  1. #include <stdio.h>
  2. int main() {
  3.    //定义:
  4.    struct Person{
  5.        char *name;
  6.        int age;
  7.    };
  8.    struct Person per={"itheima",12};
  9.    struct Person *p=&per;
  10.    char **p1=&per.name;
  11.    int *p2=&per.age;
  12.    printf("name=%s,age=%d\n",*p1,*p2);
  13.    //运行结果:name=itheima,age=12
  14.    return 0;
  15. }


结构体的内存分析

结构体分配内存空间遵循两个原则--对齐原则(增加CPU寻址效率)

1.每个元素的偏移量(当期元素首地址距离整个数组首地址的字节数)必须是自己所占字节数的整数倍.如果不够,补齐上一个元素的字节数.

2.整个结构体的字节数必须是其最大元素所占字节数的整数倍,如果不够,最后一个元素填充字节.

 
 
  1. #include <stdio.h>
  2. int main() {
  3.    struct Person{
  4.        char *name;
  5.        int age;
  6.    };
  7.    printf("%lu\n",sizeof(struct Person));  //运行结果:16
  8.    return 0;
  9. }

结构体与数组的区别:

   1.结构体可以存不同类型的元素,而数组只能存同一类型

   2.结构体类型需要我们自已定义.数组是用别的类型加[元素个数]

   3.结构体内存分配方式很特别,使用对齐原则,不一定是所有元素的字节数和,而数组一定是所有元素的字节数和.

   4.结构体指针可以指针名->结构体元素名(取元素);数组不行.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值