[牛人杂谈] typedef与struct学习总结

[复制链接]
1607|25
 楼主| mintspring 发表于 2020-10-17 14:09 | 显示全部楼层 |阅读模式
最近巩固学习一下C基础,扎实扎实。
其中难点就有结构体和typedef
特别是两者结合时候,以前没太懂,现在真懂了,分享一下经验。
  1. /*
  2.         结构体学习1,结构体的定义方式:
  3.         struct tag{member1;member2;member3;} variable-list;
  4. 或者
  5.         struct tag{member1;member2;member3;};
  6.         struct tag variable-list;
  7. */
结构体一半有两种方式定义,定义结构体时候就定义变量,甚至同时给变量赋初值;另外一种先定义结构体,然后定义变量,定义变量时候还要使用关键词struct。
其实还有第三种,根本不需要给结构体起个名字tag,也就是第一种,省略掉tag
  1. struct {member1;member2;member3;} variable-list;
这种没办法在后面使用该结构体创建新的结构体变量。

 楼主| mintspring 发表于 2020-10-17 14:17 | 显示全部楼层
接下来说typedef从字面上就可以理解这个关键字是用于创建新的类型的,类型定义,也就是给一个类型起新名字用的。
比如typedef int IN;
那么你就算给int 起了个别名IN。
typedef int IN[20];
这么写就是IN表示一个具备20个int的变量。
  1. typedef int IN[3];
  2.         IN xx={1,2,3};
  3.         printf("xx[1]=%d\n",xx[1]);


 楼主| mintspring 发表于 2020-10-17 14:18 | 显示全部楼层
接下来是将两者合并使用的时候了,这也展示真正的技术。相信很多新手,没有仔细思考的,只会用,而没理解清除怎么回事。
  1.   typedef struct stu
  2.                 {
  3.                         char name[20];
  4.                         int age;
  5.                         char sex;
  6.                 } STU;
例如这样,怎么会有stu,和STU呢,咋回事,我该用哪个?
                struct stu b1,b2;
                STU b3;

一般是这么用,两种都可以,为何呢?是不是有一些朋友没理解?


 楼主| mintspring 发表于 2020-10-17 14:23 | 显示全部楼层
其实应该这么看
  1. struct stu
  2.                 {
  3.                         char name[20];
  4.                         int age;
  5.                         char sex;
  6.                 };
这是定义结构体的方法定义了一个名字为stu的结构体类型。
我们可以把这个类型看成一个整体了,比如类型AAA
现在我们让AAA替换掉上面的。
就是类型AAA嘛,我们可以再用typedef给AAA起个新名字STU
就是
typedef AAA STU;
然后呢,我们替换回去
  1.   typedef struct stu
  2.                 {
  3.                         char name[20];
  4.                         int age;
  5.                         char sex;
  6.                 } STU;
就成这样了,
如果你单独看结构体类型stu,根据定义变量的方法是要使用关键字struct开头                      struct stu b1,b2;
而你从typedef定义的新类型STU看,那么只需要使用新的类型名字STU即可                           STU b3;

这下你搞懂了吗?



 楼主| mintspring 发表于 2020-10-17 14:41 | 显示全部楼层
最后奉上我该内容的学习总结完整版例子。
  1. #include "stdio.h"

  2. /*
  3.         结构体学习1,结构体的定义方式:
  4.         struct tag{member1;member2;member3;} variable-list;
  5. 或者
  6.         struct tag{member1;member2;member3;};
  7.         struct variable-list;
  8. 或者
  9.         struct {member1;member2;member3;} variable-list;
  10. */

  11. void test1(void)
  12. {
  13.         struct tag{int x; int y;}m[9];

  14.         for(int i=0;i<9;i++)
  15.                 {
  16.                         m[i].x=i+1;
  17.                         m[i].y=(i+1)*(i+1);
  18.                 }
  19.         for(int i=0;i<9;i++)
  20.                 {
  21.                         printf("%d*%d = %d\n",m[i].x,m[i].x,m[i].y);
  22.                 }       
  23. }

  24. void test2(void)
  25. {
  26.         struct tag{int x; int y;};
  27.         struct tag m[9];

  28.         for(int i=0;i<9;i++)
  29.                 {
  30.                         m[i].x=i+1;
  31.                         m[i].y=(i+1)*(i+1);
  32.                 }
  33.         for(int i=0;i<9;i++)
  34.                 {
  35.                         printf("%d*%d = %d\n",m[i].x,m[i].x,m[i].y);
  36.                 }       
  37. }

  38. void test3(void)
  39. {
  40.         struct {int x; int y;} m[9];

  41.         for(int i=0;i<9;i++)
  42.                 {
  43.                         m[i].x=i+1;
  44.                         m[i].y=(i+1)*(i+1);
  45.                 }
  46.         for(int i=0;i<9;i++)
  47.                 {
  48.                         printf("%d*%d = %d\n",m[i].x,m[i].x,m[i].y);
  49.                 }       
  50. }
  51. /*
  52.         定义新的类型方法
  53. typedef  要被定义的内容  新的类型名
  54. 这与#define刚好相反
  55. #define 起个新名字  要被替换的内容
  56. 例如
  57. #define PI 3.14
  58. typedef int INTER;
  59. */
  60. void test4(void)
  61. {
  62.         typedef int IN[3];
  63.         IN xx={1,2,3};
  64.         printf("xx[1]=%d\n",xx[1]);
  65. }

  66. void test5(void)
  67. {
  68.         typedef struct stu
  69.         {
  70.                 char *name;
  71.                 int age;
  72.                 char sex;
  73.         } STU;
  74. //通过typedef给后面的结构体起了个新的名字STU,下面两种创建方式效果是一样。
  75.         struct stu b1,b2;
  76.         STU b3={"TOM",18,1};
  77.         b1=b3;
  78.         b2.name="Jack";
  79.         b2.age = 14;
  80.         b2.sex = 0;
  81.         printf("Name:%s \n Age:%d \n SEX:%d\n",b2.name,b2.age,b2.sex);
  82.         printf("Name:%s \n Age:%d \n SEX:%d\n",b3.name,b3.age,b3.sex);
  83. }

  84. int main(void)
  85. {

  86.         test1();
  87.         printf("---------------------------------------------------\n");
  88.         test2();
  89.         printf("---------------------------------------------------\n");
  90.         test3();
  91.         printf("---------------------------------------------------\n");
  92.         test4();
  93.         printf("---------------------------------------------------\n");
  94.         test5();
  95.         printf("---------------------------------------------------\n");

  96.         return 0;
  97. }
小明的同学 发表于 2020-10-17 14:42 | 显示全部楼层
真的很棒。
小灵通2018 发表于 2020-10-17 14:42 | 显示全部楼层
多谢大佬分享。
稳稳の幸福 发表于 2020-10-17 14:43 | 显示全部楼层
太牛叉了,感谢分享。
643757107 发表于 2020-10-17 14:44 | 显示全部楼层
灵魂好贴,楼主继续分享啊
643757107 发表于 2020-10-17 14:44 | 显示全部楼层
分享点指针和链表的。还按照这种通俗易懂的讲解方式。
643757107 发表于 2020-10-17 14:59 | 显示全部楼层
链表是要用到这个结构体的,还不是太懂。
jiekou001 发表于 2020-10-17 17:58 | 显示全部楼层
非常的赞。
xinpian101 发表于 2020-10-17 18:08 | 显示全部楼层
干货满满的。
BettyBerry 发表于 2020-10-17 21:41 | 显示全部楼层
谢谢楼主分享 最近刚好学到 没搞太懂结构体的具体用处 看到你这我就理解了
darklighttt 发表于 2020-10-18 09:35 | 显示全部楼层
多谢楼主的分享,我觉得难点还在于不同文件之间的结构体引用,搞过一次,引用太复杂了。
24kdewhite 发表于 2020-10-18 14:02 | 显示全部楼层
我是这么理解的,typedef就加在定义各种类型的前面,这个类型,可以是已有的,也可以是自定义的,所定义类型变量的名称,也就是新类型的名称
24kdewhite 发表于 2020-10-18 14:09 | 显示全部楼层
24kdewhite 发表于 2020-10-18 14:02
我是这么理解的,typedef就加在定义各种类型的前面,这个类型,可以是已有的,也可以是自定义的,所定义类 ...

然而typedef定义的类型只是一个蓝本,里面声明的变量实际是新类型的替换,所以要是用里面的原数据类型,要在前面加相应解释
zhuotuzi 发表于 2020-10-18 15:19 | 显示全部楼层
哇塞好贴。高手们多多讨论啊,发现好多地方用这两个关键词
zhuotuzi 发表于 2020-10-18 15:20 | 显示全部楼层
24kdewhite 发表于 2020-10-18 14:02
我是这么理解的,typedef就加在定义各种类型的前面,这个类型,可以是已有的,也可以是自定义的,所定义类 ...

已有的是系统自带的基础类型,而自定义的可以是组合类型(结构体、联合体),是这个意思吧
zhuotuzi 发表于 2020-10-18 15:21 | 显示全部楼层
各位大侠们,出一个系列吧,我慢慢学
您需要登录后才可以回帖 登录 | 注册

本版积分规则

303

主题

4972

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部