数据结构,看不懂typedef一个结构体后的声明?为啥一个带*一个不带*,来,小龙教你轻松辨别 您所在的位置:网站首页 数据结构函数名 数据结构,看不懂typedef一个结构体后的声明?为啥一个带*一个不带*,来,小龙教你轻松辨别

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

2023-10-12 07:16| 来源: 网络整理| 查看: 265

一、废话少说,切入正题! 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 #include 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个字节。 多好,内存不浪费~~~

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有