一、废话少说,切入正题!
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个字节。
多好,内存不浪费~~~
下次见,我是小龙,小龙小龙不是码农!