数据结构,看不懂typedef一个结构体后的声明?为啥一个带*一个不带*,来,小龙教你轻松辨别

本文介绍了typedef在C语言中如何为结构体定义别名,简化变量声明。通过实例解释了使用typedef后,如何直接用别名声明结构体变量和指针,以及如何通过指针访问结构体成员。此外,还强调了当结构体成员包含指针时,必须初始化指针以避免内存问题。最后讨论了指针类型在内存对齐和避免浪费上的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、废话少说,切入正题!

typedef struct Student{
	int age;
	int id;
}Student, * Studentp;

这段代码,很显然,这个结构体呢,他叫Student,如果下面这段代码

typedef struct Student{
	int age;
	int id;
}Student;

大家应该不难看出,
我本来创建一个Student结构体变量,
应该是

struct Student student1; // 若不用typedef

但现在,我可以直接用

Student student1; // 若使用typedef 

为啥呢?
因为typedef相当于给结构体 struct Student 定义了一个别名,这个别名叫 Student
所以我可以直接用Student来声明一个结构体变量。

二、 关于对象引用?

若使用 struct Student student1;
那么,访问结构体变量的时候应该用 “.”,这个东西的优先级最高。

struct Student student1;
student1.age;

那要是使用了typedef之后呢?

/*typedef部分省略*/
Student student1;
student1.age;

这两个其实没什么区别,只不过,用typedef之后呢省略了你struct的部分。

重点来了,如果用Studentp来创建变量了?
嘿嘿,记住分配内存或者让指针指向结构体哦!
快看下面~

Studentp student1; // 注意是Studentp,我习惯结构体指针,在变量后+p
student1 = (studentp)malloc(sizeof(Student)); // 指针,要么你主动分配内存,要么你把这个指针指向一个已有的结构体~
student1->age; // 那这里student1就是一个结构体变量的指针,要用->访问

是不是很简单?
相当于你Studentp创建的是一个结构体的指针,那访问也需要用指针的形式访问!

我是小龙,小龙小龙不是码农,好耶!

三、不行不行,如果结构体成员也有指针类型,这里要提个醒!!!

假如结构体是这样的?

typedef struct Student{
	int* age;  //也就是age是int*类型,age是指针。
	int id;
}Student, * Studentp;

那这个时候,就必须要对指针 age 也要初始化!

#include <stdio.h>
#include <stdlib.h>
typedef struct Student {
	int* age;
	int id;
}Student, * Studentp;

int main() {
	Studentp A ; // A是指向某一 struct Student 的一个指针
	A = (Studentp)malloc(sizeof(Student)); // 指针 A 初始化
	A->age = (int*)malloc(sizeof(int)); // A->age,age也是一个指针,需要初始化
	*(A->age) =1 ; // A->age是指针,访问变量需要*(A->age)!!!!
	printf("%d", *(A->age)); // 这里也是,如果不整体加*,就会输出地址
	return 0;
}

四、关于为啥结构体成员也有指针类型??

其实是方便内存对齐,不造成内存浪费。
因为结构体里面默认按照成员变量的最大内存对齐。
比如

typedef struct Student {
	char id; // 这里用了 char 类型
	int age;
}Student, * Studentp;

char第0个的话。age就从第4个内存开始了。
相当于第1,第2,第3个内存是空的,万一出事儿了嘞?
所以可以用

typedef struct Student {
	char* id; // 这里用了 char* 类型
	int age;
}Student, * Studentp;

char*,它就占4个字节。
多好,内存不浪费~~~

下次见,我是小龙,小龙小龙不是码农!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龙不会喷火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值