通过代码详解C语言typedef用法及访问结构体成员的两种方式(->和.)

写本篇文章前博主对typedef和访问结构体元素的两种方式一直含糊不清。这不,今天在看哈希索引和哈希表时回过来再重温一下C语言这方面的内容,仔细梳理一下思路后,用具体代码的方式分享一下吧!创作不易,多点赞和关注哦!

一,使用typedef的好处

如果不用typedef定义结构体,举个栗子:

struct jiegouti2{
int data;
};

应该是上面这样的,那如果使用typedef定义呢?

typedef是将整个结构体定义取另一个简单的名字,也就是俗说的取别名。目的就是为了以后定义其它变量不用把代码写得又臭又长(手动狗头.jpg)。

红色框部分只是普通的结构体定义方式,而利用typedef语句将整个红色框部分取名为jgt。

好,那么怎么定义结构体指针呢

如果不用typedef定义结构体,那么就只能用这种繁琐的方式定义结构体指针了:

struct jiegouti2 *q;

但是如果用typedef取了jgt这个别名呢?

这就简单了

jgt *q就行;jgt就相当于struct jiegouti2 *q;

接下来讨论指针分配空间的问题,下面的代码,两种最后的输出结果都是一样的(创建了两种结构体,一种是用typedef声明,另一种是用普通struct声明,可以通过比较看出typedef的好处)

#include<stdio.h>
#include<stdlib.h>

//使用typedef
typedef struct jiegouti{
int data;
}jgt;
int main()
{
jgt *p=(jgt *)malloc(sizeof(jgt)*100);//简洁
p[0].data=1;
printf("%d\n",p[0].data);
p->data=2;
printf("%d\n",p->data);
}

 

#include<stdio.h>
#include<stdlib.h>
//不使用typedef
struct jiegouti2{
int data;
};
int main()
{
struct jiegouti2 *q=(struct jiegouti2 *)malloc(100);//看看这句是不是相比没有typedef而言繁琐得多,而且容易出错
q[0].data=1;
printf("%d\n",q[0].data);
q->data=2;
printf("%d\n",q->data);
}

扩展:typedef在树结构中的使用

//采用二叉链表的方式定义二叉树结构体,结构体中存有三个值,分别是结点值,指向左孩子结点的指针和指向右孩子结点的指针
typedef struct node{
int k;
struct node *lt,*rt;//注意这句代码不能写成:node *lt,*rt;
}node,*tree;            //将struct node取别名为node

int main()
{
node *tr=null;//如果不用typedef取的别名node就只能写成struct node *tr=null
}

二,访问结构体成员的两种方式

首先详解一行代码:jgt *p=(jgt *)malloc(sizeof(jgt)*100);

这句看似简单的语句其实实现了3个操作:

1,jgt *p语句定义一个结构体指针变量,即开辟一个指针

2,(jgt *)malloc(sizeof(jgt)*100)语句在内存中分配一段连续的内存地址空间

3,第一步开辟的指针指向第二步开辟的内存。注意了,不是给指针变量本身赋予地址空间而是用指针指向内存中连续地址空间(PS:malloc函数在stdlib.h这个头文件中声明)

 

指针变量的定义:存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。

有了指针后,访问一个结构体就可以用指针变量名[结构体序号]的形式表示,比如上例中p[0]表示第一个结构体,p[1]表示第二个结构体。。。

那么如何访问一个结构体的内部元素呢?可以采取两种方式(具体例子同见上文代码):

1,采用结构体.内部元素变量名的形式,如上例中的P[0].data

2,采用指针变量名->内部元素变量名的形式,如上例中的P->data

如果能仔细想清楚这两个的区别,那么看Hash表就不会有不舒服的感觉了。

创作不易,点个赞吧!

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

END

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值