打印
[牛人杂谈]

typedef与struct学习总结

[复制链接]
697|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mintspring|  楼主 | 2020-10-17 14:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近巩固学习一下C基础,扎实扎实。
其中难点就有结构体和typedef
特别是两者结合时候,以前没太懂,现在真懂了,分享一下经验。
/*
        结构体学习1,结构体的定义方式:
        struct tag{member1;member2;member3;} variable-list;
或者
        struct tag{member1;member2;member3;};
        struct tag variable-list;
*/
结构体一半有两种方式定义,定义结构体时候就定义变量,甚至同时给变量赋初值;另外一种先定义结构体,然后定义变量,定义变量时候还要使用关键词struct。
其实还有第三种,根本不需要给结构体起个名字tag,也就是第一种,省略掉tag
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的变量。
 typedef int IN[3];
        IN xx={1,2,3};
        printf("xx[1]=%d\n",xx[1]);


使用特权

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

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


使用特权

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

这下你搞懂了吗?



使用特权

评论回复
5
mintspring|  楼主 | 2020-10-17 14:41 | 只看该作者
最后奉上我该内容的学习总结完整版例子。
#include "stdio.h"

/*
        结构体学习1,结构体的定义方式:
        struct tag{member1;member2;member3;} variable-list;
或者
        struct tag{member1;member2;member3;};
        struct variable-list;
或者
        struct {member1;member2;member3;} variable-list;
*/

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

        for(int i=0;i<9;i++)
                {
                        m[i].x=i+1;
                        m[i].y=(i+1)*(i+1);
                }
        for(int i=0;i<9;i++)
                {
                        printf("%d*%d = %d\n",m[i].x,m[i].x,m[i].y);
                }       
}

void test2(void)
{
        struct tag{int x; int y;};
        struct tag m[9];

        for(int i=0;i<9;i++)
                {
                        m[i].x=i+1;
                        m[i].y=(i+1)*(i+1);
                }
        for(int i=0;i<9;i++)
                {
                        printf("%d*%d = %d\n",m[i].x,m[i].x,m[i].y);
                }       
}

void test3(void)
{
        struct {int x; int y;} m[9];

        for(int i=0;i<9;i++)
                {
                        m[i].x=i+1;
                        m[i].y=(i+1)*(i+1);
                }
        for(int i=0;i<9;i++)
                {
                        printf("%d*%d = %d\n",m[i].x,m[i].x,m[i].y);
                }       
}
/*
        定义新的类型方法
typedef  要被定义的内容  新的类型名
这与#define刚好相反
#define 起个新名字  要被替换的内容
例如
#define PI 3.14
typedef int INTER;
*/
void test4(void)
{
        typedef int IN[3];
        IN xx={1,2,3};
        printf("xx[1]=%d\n",xx[1]);
}

void test5(void)
{
        typedef struct stu
        {
                char *name;
                int age;
                char sex;
        } STU;
//通过typedef给后面的结构体起了个新的名字STU,下面两种创建方式效果是一样。
        struct stu b1,b2;
        STU b3={"TOM",18,1};
        b1=b3;
        b2.name="Jack";
        b2.age = 14;
        b2.sex = 0;
        printf("Name:%s \n Age:%d \n SEX:%d\n",b2.name,b2.age,b2.sex);
        printf("Name:%s \n Age:%d \n SEX:%d\n",b3.name,b3.age,b3.sex);
}

int main(void)
{

        test1();
        printf("---------------------------------------------------\n");
        test2();
        printf("---------------------------------------------------\n");
        test3();
        printf("---------------------------------------------------\n");
        test4();
        printf("---------------------------------------------------\n");
        test5();
        printf("---------------------------------------------------\n");

        return 0;
}

使用特权

评论回复
6
小明的同学| | 2020-10-17 14:42 | 只看该作者
真的很棒。

使用特权

评论回复
7
小灵通2018| | 2020-10-17 14:42 | 只看该作者
多谢大佬分享。

使用特权

评论回复
8
稳稳の幸福| | 2020-10-17 14:43 | 只看该作者
太牛叉了,感谢分享。

使用特权

评论回复
9
643757107| | 2020-10-17 14:44 | 只看该作者
灵魂好贴,楼主继续分享啊

使用特权

评论回复
10
643757107| | 2020-10-17 14:44 | 只看该作者
分享点指针和链表的。还按照这种通俗易懂的讲解方式。

使用特权

评论回复
11
643757107| | 2020-10-17 14:59 | 只看该作者
链表是要用到这个结构体的,还不是太懂。

使用特权

评论回复
12
jiekou001| | 2020-10-17 17:58 | 只看该作者
非常的赞。

使用特权

评论回复
13
xinpian101| | 2020-10-17 18:08 | 只看该作者
干货满满的。

使用特权

评论回复
14
BettyBerry| | 2020-10-17 21:41 | 只看该作者
谢谢楼主分享 最近刚好学到 没搞太懂结构体的具体用处 看到你这我就理解了

使用特权

评论回复
15
darklighttt| | 2020-10-18 09:35 | 只看该作者
多谢楼主的分享,我觉得难点还在于不同文件之间的结构体引用,搞过一次,引用太复杂了。

使用特权

评论回复
16
24kdewhite| | 2020-10-18 14:02 | 只看该作者
我是这么理解的,typedef就加在定义各种类型的前面,这个类型,可以是已有的,也可以是自定义的,所定义类型变量的名称,也就是新类型的名称

使用特权

评论回复
17
24kdewhite| | 2020-10-18 14:09 | 只看该作者
24kdewhite 发表于 2020-10-18 14:02
我是这么理解的,typedef就加在定义各种类型的前面,这个类型,可以是已有的,也可以是自定义的,所定义类 ...

然而typedef定义的类型只是一个蓝本,里面声明的变量实际是新类型的替换,所以要是用里面的原数据类型,要在前面加相应解释

使用特权

评论回复
18
zhuotuzi| | 2020-10-18 15:19 | 只看该作者
哇塞好贴。高手们多多讨论啊,发现好多地方用这两个关键词

使用特权

评论回复
19
zhuotuzi| | 2020-10-18 15:20 | 只看该作者
24kdewhite 发表于 2020-10-18 14:02
我是这么理解的,typedef就加在定义各种类型的前面,这个类型,可以是已有的,也可以是自定义的,所定义类 ...

已有的是系统自带的基础类型,而自定义的可以是组合类型(结构体、联合体),是这个意思吧

使用特权

评论回复
20
zhuotuzi| | 2020-10-18 15:21 | 只看该作者
各位大侠们,出一个系列吧,我慢慢学

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

4810

帖子

24

粉丝