C语言中struct typedef 以及结构体指针用法

struct 、typedef以及结构体指针用法


  typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。具体区别在于:

  • 若struct node{ }这样来定义结构体的话。在定义 node 的结构体变量时,需要这样写:struct node n;
  • 若用typedef,可以这样写:typedef struct node{}NODE; 。在申请变量时就可以这样写:NODE n;其实就相当于 NODE 是node 的别名。区别就在于使用时,是否可以省去struct这个关键字。 有些时候,typedef struct NODE{ }NODE;还是可以直接NODE n;定义一个NODE类型的结构体

typedef用法

用法举例1:在C中定义一个结构体类型时如果要用typedef:

typedef struct Student
{
   int no;
   char name[12];
}Stu,student;

于是在声明变量的时候就可:Stu stu1;或者:student stu2;(Stu 和student 同时为Student的别名)
用法举例2:如果没有typedef,传统定义一个结构体:

struct Student
{
   int no;
   char name[12];
}Stu;

此时说明已经定义了一个结构体Stu变量,如果要重新新建,就必须用struct Student stu1;
用法举例3:如果使用了typedef,另外这里也可以不写Student(于是也不能struct Student stu1;了)

typedef struct
{
   int no;
   char name[12];
}Stu;

用法举例4:typedef 还可以掩饰复合类型,如指针和数组。定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样

typedef char Line[81]; 

此时Line类型即代表了具有81个元素的字符数组,使用方法,例如Line text, secondline;

结构体指针用法

结构体指针用法1
结构体要自引用时,Student1是错误用法。试想引用成员next是另一个完整的结构,其内部还将包含它自己的成员next,这第二个成员又包含一个完整的结构,它还将包括它自己的成员next,这样重复下去永无休止,内存都用光了。所以不合法。

struct Student1
{
   int age;
   struct Student1 next;
};

正确的用法是:结构体自引用 ,只能自引用指针。编译器在结构的长度确定之前就已经知道指针的长度,所以这种自引用是合法的。结构体的自引用在实现链表,树等高级的操作时用处很大。

struct Student1
{
	int age;
	struct Student *next; 
};

结构体指针用法注意:这样是不行的,虽然Student1代表了结构体,但是Student1类型名的声明是在末尾定义,当要声明struct{ }时,内部无法识别Student1类型。

typedef struct 
{
	int age;
	Student1 *next; 
}Student1,*StudentPtr;

结构体指针用法2
注意此时,Student1是struct Student{}的别名,StudentPtr是Student的指针

typedef struct Student1
{
	int age;
	Student1 *next; 
}Student1,*StudentPtr;

  我使用StudentPtr时出现了个有意思现象,结构体指针若不手动分分配内存,讲道理是不能用的。当定义了两个结构体指针s1,s2,两个结构体指针都不分配内存,给其中一个赋值,然后使用没有问题,输出良好。

#include <stdio.h>
typedef struct Student1
{
	int age;
	 Student1 *next; 
}Student1,*StudentPtr;
int main()
{
	StudentPtr  s1;
	StudentPtr  s2;
	s1->age= 9;
	printf("%d",s1->age);
	return 0;
}

  当尝试给另一个结构体指针赋值时,编译没有问题,程序运行奔溃。

在这里插入图片描述
在这里插入图片描述
  正确用法应该是

  1. 结构体指针需要初始化
  2. 结构体指针的成员指针同样需要初始化
  3. 若直接使用结构体,结构体中有成员指针,成员指针也要先初始化

在这里插入图片描述

结构体初始化

  结构的初始化方式和数组初始化很相似。一个位于一对花括号内部,由逗号分隔的初始值列表可用于结构的初始化。这些值根据结构成员列表的顺序写出。
在这里插入图片描述

  • 215
    点赞
  • 757
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
C语言typedef关键字可以用来定义自己习惯的数据类型名称。在结构体typedef可以用来简化结构体的定义和声明。通过使用typedef,我们可以为结构体类型定义一个新的名称,使得在使用结构体时更加方便。例如,可以使用typedef定义一个新的名称来代替struct关键字,从而在声明结构体变量时不再需要使用struct关键字。\[1\]另外,typedef还可以用来定义指向结构体的指针类型,从而简化指向结构体的指针变量的声明。\[3\]总之,typedefC语言结构体用法主要是为结构体类型和指针类型定义新的名称,以提高代码的可读性和简洁性。 #### 引用[.reference_title] - *1* *2* [C语言结构体用到的typedef](https://blog.csdn.net/weixin_44477424/article/details/122796704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [typedef用法——c语言](https://blog.csdn.net/weixin_47783699/article/details/128135573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值