关于结构体和结构体指针写法的一些细节
定义结构体
typedef struct {
int data[10];
int len ;
}LNode;
通常我会这样定义一个结构体 但是涉及数据结构的操作时我们往往需要一个结构体指针。于是乎我便写成了这样
typedef struct {
int data[10];
int len ;
}*LNode;
看起十分正常合情合理 于是我继续写下去
#include<stdio.h>
typedef struct {
int data[10];
int len ;
}*LNode;
int main()
{
LNode l;
l = malloc(sizeof(LNode)); //也可以强制转型一下 l =(LNode*) malloc(sizeof(LNode));
l->len=123;
printf("l->len : %d",l->len);
return 0;
}
定义结构体->动态申请内存->赋值->输出
完全没有问题 输出也是正常
问题出现于我看到以下2种写法
第一种
typedef struct List {
int data[10];
int len ;
}*LNode;
很直观就是结构体多了一个名字 List
#include<stdio.h>
typedef struct List {
int data[10];
int len ;
}*LNode;
int main()
{
struct List *l;
l =(struct List*)malloc(sizeof(struct List));
//动态申请内存的代码和这行效果是一样的 l = malloc(sizeof(LNode));
l->len=100;
printf("%d",l->len);
return 0;
}
这种写法使结构体多了一个名字 List 却在后面几乎用不上
在动态申请中利用上这个List 又感觉非常刻意 而且代码量变多了 让tydedef颜面何存呀
这样写其实是有优点的 也是我最推荐的一种写法
首先我们在利用结构体指针的时候
在函数中改变后 main()中也会有所改变
这是指针的一大优点 不可否认
但是如果我们想要达到一个这样的效果 即函数中的结构体变量改变并不影响main()中的结构体呢?
倘若利用指针我们是无法完成的,我们需要一个本地变量(局部变量),所以我们需要一个结构体的名字List 来完成这样一个需求 ,这种写法不仅仅保存了指针的优势而且还可以使用结构体本地变量,何乐而不为了。
第二种写法
typedef struct {
int data[10];
int len ;
}List, *LNode;
这算是让我看着比较头疼的一种写法
但是许多教科书(王道数据结构)上确实这么写了
typedef 究竟是把这个struct 定义为 List 还是 LNode呢?
答案:它定义了List的本地变量 和一个 LNode的结构体指针 W(和第一种效果是一样的,只是可读性差了点)
总结
我个人还是推荐第一种写法在可读性不错的情况下保留了结构体本地变量和指针的用法
但是第二种其实个人接受以后也十分好用。由于教课书和视频上都有出现这种写法,所以还是值得一用的。