struct 与 typedef struct

struct和typedef struct 1. C语言结构体Struct 在C语言中,通过结构体Struct来定义一组不同类型的数据,其定义形式为: struct 结构体名{          结构体的成员 }; struct stu{     char *name;  //姓名     int num;  //学号     float score;  //成绩 }; 通过结构体定义的数据类型可用来定义变量,如stru 阅读详情

struct 与 typedef struct

1. 基本解释

  typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

  在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

  至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。


2. typedef & 结构的问题

  当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:

typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;

  答案与分析:

  1、typedef的最简单使用

typedef long byte_4;

  给已知数据类型long起个新名字,叫byte_4。

  2、 typedef与结构结合使用

typedef struct tagMyStruct
{
 int iNum;
 long lLength;
} MyStruct;

  这语句实际上完成两个操作:

  1) 定义一个新的结构类型

struct tagMyStruct
{
 int iNum;
 long lLength;
};

  分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

  我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

  2) typedef为这个新的结构起了一个名字,叫MyStruct。

typedef struct  tagMyStruct  MyStruct;

  因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

  答案与分析

  C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。

  根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

  解决这个问题的方法有多种:

  1)、

typedef struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
} *pNode;

  2)、

typedef struct tagNode  *pNode;
struct tagNode
{
 char *pItem;
 pNode pNext;
};

  注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

  3)、规范做法:

struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
};
typedef struct tagNode  *pNode;

“typedef struct node{} *pNODE;”中 pNODE是struct node*的一个别名,表示指向结构体node类型的 指针类型,“pNODE pnode;”
当然 在定义的时候可以省去node,typedef struct {} NODE。
复制代码
分三块来讲述:
1 首先:
      在C中定义一个结构体类型要用typedef:
        typedef struct Student
        {
            int a;
        }Stu;
于是在声明变量的时候就可:Stu stu1;
如果没有typedef就必须用struct Student stu1;来声明
这里的Stu实际上就是struct Student的别名。
另外这里也可以不写Student(于是也不能struct Student stu1;了)
        typedef struct
        {
            int a;
        }Stu;
但在c++里很简单,直接
        struct Student
        {
           int a;
        };
于是就定义了结构体类型Student,声明变量时直接Student stu2;
===========================================
2其次:
在c++中如果用typedef的话,又会造成区别:
       struct   Student   
       {   
          int   a;   
       }stu1;//stu1是一个变量   
       typedef   struct   Student2   
       {   
          int   a;   
        }stu2;//stu2是一个结构体类型   
使用时可以直接访问stu1.a
但是stu2则必须先   stu2 s2;
然后               s2.a=10;
===========================================
3 掌握上面两条就可以了,不过最后我们探讨个没多大关系的问题
如果在c程序中我们写:
       typedef struct  
       {
           int num;
           int age;
       }aaa,bbb,ccc;
这算什么呢?
我个人观察编译器(VC6)的理解,这相当于
       typedef struct  
       {
           int num;
           int age;
       }aaa;
       typedef aaa bbb;
       typedef aaa ccc;
也就是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。
关于结构体的那些事(struct 与 typedef struct) 理清楚结构体的定义,以及区别开 struct 与 typedef struct 的用法 阅读详情

相关推荐

一步一步教你从零开始写C语言链表

完整源码获取: 微信关注:嵌入式开发圈 发送"链表"即可获取。 为什么要学习链表? 链表主要有以下几大特性: 1、解决数组无法存储多种数据类型的问题。 2、解决数组中,元素个数无法改变的限制(C99的变长数组,C++也有变长数组可以实现)。 3、数组移动元素的过程中,要对元素进行大范围的移动,很耗时间,效率也不高。 先来感性的认识一下链表,我们先来认识下简单的链表: 从这幅图我们...

Bruce.yang的嵌入式之旅 18万+

typedef struct node的用法及与struct node的区别,为何要用typedef?

typedef的作用是为已有的数据类型定义一个新名字,其主要目的是为了我们在使用时能用这个更加清晰简单的新名字,还有一个目的就是为了简化变量的声明。 下面的几段代码具有相同的功能,都是用于链表结构体节点的定义和声明: 第一种方式: struct node { int data; // 节点的数据域 struct node *next; // 节点的指针域 }; struct node n; // 定义一个单个节点 第二种方式: struct node { int data; // 节点的数

qq_43511299的博客 1万+

embedding计算过程

文章目录embedding计算过程(错了跟我讲,我会改)参考示例个人理解过程图示总结(基于pytorch) embedding计算过程(错了跟我讲,我会改) 参考示例 https://www.jianshu.com/p/63e7acc5e890 个人理解过程图示 总结(基于pytorch) 总的来说,就是将独热向量的长度(对应嵌入层的num_embeddings)转变为嵌入层的emdedding_size(而独热向量的维数就是你的数据中一共产生了多少个不一样的词,至少是这么多)。 数据的变化,将二维

纸上得来终觉浅,绝知此事要躬行! 1631

结构体定义 typedef struct 用法详解和小结

typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型.typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。在编程中使用typedef目的一般有两个,一个是给变量提供一个易记且意义明确的新名字(类型有新别名,方便变量的定义),另一个是简化一些比较复杂的类型声明。在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

Cerulea_n的博客 4万+

unity C# 计算3D空间任意多边形面积,距离,角度测量工具

unity C# 计算3D空间任意多边形面积,距离,角度 using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using System; /// /// 划线面积,距离,角度 /// public class UnderlinedMeasureTool : MonoBehaviour { /// /// 相机 /// public Camera _c

qq_22972867的博客 2224

Fluent基于低氧舱气体交换仿真(氮气与空气混合)

一、背景概述 模拟低氧舱充氮气和排除混合气体的过程,假设注入95%的氮气,舱内原有气体为空气,压力为标准大气压,温度为300K。观察气体注入过程中,舱内平均氮气和氧气浓度的变化。 二、Fluent设置 Setup 1、General type选择压力基 绝对速度 瞬态 重力勾选 2、Model 能量方程开启 组分运输开启,设置方法如下: 选择后OK,view就会变成Edit,点击Edit。然后再次点击Edit。 将组分中的非氮气氧气和空气的气体移除,右边选项需要将空气放在最后一位。 3、Materi

qq_35535616的博客 1万+

【C语言】typedef struct node{}a,*b;到底是什么意思?

  很多小伙伴知道 typedef int a;的作用相当于将int 换名为a; 也知道typedef struct node{xxx}b;的意思是将这个结构体命名为b;但是对于这样的代码 typedef struct Node { int value1; int value2; }*p,a; 确不知道这两个表示的什么。首先我们先明确一个typedef最基本的定义 typedef...

qq_35624030的博客 1万+

告别手动改图!用Python+PyWin32驱动SolidWorks,实现参数自动化修改(保姆级避坑指南)

本文详细介绍了如何利用Python和PyWin32驱动SolidWorks实现参数自动化修改,提供从环境配置到API连接的工业级解决方案。通过实战案例和避坑指南,帮助工程师高效搭建自动化脚本工作流,显著提升设计效率。

weixin_30614109的博客 741

typedef struct 和typedef struct node

typedef struct:只是定义了一个新的类型名称,这个类型名称可以用来定义结构体变量,但是其本身并没有定义任何结构体变量。因此,当我们使用typedef struct node来定义结构体变量时,可以直接使用node作为结构体变量的类型名称。typedef struct node:定义了一个新的类型名称,同时将这个新类型名称指向一个结构体变量。

2301_78066243的博客 1053

Elsevier投稿避坑指南:Ocean Engineering论文格式要求详解(附Checklist模板)

本文详细解析Elsevier旗下期刊Ocean Engineering的投稿格式要求与常见陷阱,提供实用的Checklist模板。涵盖文章类型确认、作者贡献声明、图表规范、数据声明等关键环节,帮助研究者高效通过格式审查。特别强调LaTeX排版细节、图表分辨率要求及现代伦理声明规范,助力海洋工程领域学者顺利投稿。

weixin_33734785的博客 1493

千兆网口电路设计中的EMC防护与TVS选型实战

本文深入探讨了千兆网口电路设计中面临的EMC挑战,并提供了TVS二极管选型的实战指南。文章分析了ESD、浪涌和EFT等主要威胁,重点阐述了如何根据工作电压、钳位电压和关键的低结电容等参数为PHY芯片选择匹配的TVS器件,以确保在严苛电磁环境下实现可靠的信号完整性与防护。

m3n5b7v8c9x的博客 531

typedef struct 用法

typedef struct 用法

m0_65508678的博客 4万+

PNP NPN线性接近开关接线嵌入式:详细指南与示例代码

在嵌入式系统中,PNP和NPN线性接近开关是常用的传感器类型,用于检测物体的接近或离开。在嵌入式系统中,PNP和NPN线制接近开关是常用的传感器类型,用于检测物体的接近或离开。本文提供了有关PNP和NPN线性接近开关接线的详细指南,并提供了一个简单的示例代码,以帮助您在嵌入式系统中正确使用这些传感器PNP NPN 线制接近开关接线 嵌入式:详细指南与示例代码。与PNP开关不同的是,NPN线性接近开关的正极连接至系统的正极电源。与PNP开关不同的是,NPN线制接近开关的正极连接至系统的正极电源。

CyberSphinx的博客 1272

struct与typedef struct的区别

typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n; 若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n; 区别就在于使用时,是否可以省去str

shanshanhi的博客 6万+

OpenClaw实战:拒绝复制粘贴,用 xlsx 技能打通“带公式模板”的月报自动化

本文详解了如何利用 OpenClaw 框架搭载的 xlsx skill,解决 AI 自动化处理“带复杂公式与格式”Excel 月报时极易翻车的业务痛点。针对传统大模型粗暴写入导致模板报废的问题,OpenClaw 创新采用“双核微创”工作流:首先利用 pandas 高效清洗并聚合海量原始明细数据,随后切换至 openpyxl 将计算结果精准注入目标模板,完美保留原有的底色、边框与跨表动态公式。

我有一个梦想 151

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Typedef Struct 用法详解

Typedef Struct 用法详解 一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间。 实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性...

PengCoX 9936

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

struct和typedef struct彻底明白了

更详细和准确内容参见: C/C++语法知识:typedef struct 用法详解 typedef struct OLNode {   int i,j;   int data;   OLNode *right,*down; }OLNode,*OLink;//结构的对象OLNode, 指向结构的指针*OLink, 可以这样写 struct OLNode{}; OLNode OLNode, *O...

Poo_Chai的博客 8万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

typedef struct与struct的区别

在学习c语言数据结构的过程中,经常性的会遇到定义结构体的格式,形式为: typedef struct { int a[100]; int len; }SeqList; SeqList List; 这里定义了一个长度为100的顺序表,而我平时如果定义,则会如下: struct SeqList { int a[100]; int len; }List; 大致一看,二者的区别在于typedef...

qq_45704650的博客 7947

typedef enum & typedef struct

enum 与 typedef enum 在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作 #define Mon 1 #define Tue 2 #define Wed 3 ... 在此我们可以考虑定义一种新的数据类型:枚举型 enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; (1) 枚举型是一个集合...

lc574260570的博客 2782

C 语言中 typedef struct 与 struct 的区别详解

不同系统的可能有不同的长度,使用typedef可以保证代码在不同平台上的一致性。方式适用场景优点缺点struct需要明确结构体标签的情况代码易读,结构清晰需要struct关键字,代码冗长需要简化结构体使用,提高可读性省略struct关键字,代码更简洁可能影响struct命名一致性(匿名结构体)只需定义类型,而不关心struct标签最简洁,减少命名冲突不能使用struct关键字访问在 C 语言编程中,如果你需要提高代码的可读性,避免struct关键字的冗余,推荐使用。如果你需要。

Yhame的博客 1993

typedef和struct

<br />typedef<br />typedef 类型-声明 同义字;<br />Typedef关键字定义由其指定的 类型-声明 的同义字。类型-声明 中的声明标识符成为类型的另一个名称(即别名),别名的作用是在命名属于该类型的实例时替换类型名称。同样可以在函数定义中使用typedef指派符。<br />Typedef 引入了一个名称,该名称在 Typedef声明范围内的decl-specifiers部分中声明,以作为类型的同义字。与class、 struct、 union 和 enum等声明符相比,t

Coder Calvin at Work 2160

关于typedef struct和struct对比

为什么要提出typedef的用法,因为相对于struct 结构体使用起来更方便。下面就是他们之间的对比: struct结构体 #include"stdio.h" struct Student { int sid; char name [100]; char sex; } int main(){ struct Student st; //定...

weixin_42760452的博客 1334

typedef struct 的用法

结构体类型定义 定义方式1: Typedef struct LNode { int data; //数据域 struct LNode *next; //指针域 } *LinkList; 定义方式2: struct LNode { int data; //数据域 struct LNode *next; //指针域 }; typedef struct LNode *LinkList; 以上两个定义方式是等价的。 是将 *LinkList 定义为 struct L

w_45678910的博客 4531

【C++】struct与typedef struct

struct 与 typedef struct1. ctypedef的作用struct 与 typedef struct 的区别标准形式2. c++ 1. c typedef的作用 typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型。    typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。    在编程中使用typedef目的一般有两个,一个是给变量提供一个易记且意义明确的新

https://blog.youkuaiyun.com/WL0616 382

【C语言】typedef struct 和 struct 使用区别

1. 什么是 typedef ? typedef 可以为某一类型自定义名称,与#define类似,但区别如下: typedef和#define区别 typedef define(预处理器) 创建的符号名字只限于类型,不能用于值。 明示常量 typedef由编译器解释,不是预处理器 #define PX printf("x id %d. \n", x) 可声明一系列变量 不可以声明一系列变量 typedef int8 BYTE; 则可以使用BYTE...

Roger_717的博客 3969
上一篇: 需要友元的原因及使用
下一篇: C++重要知识点小结---3
大老鼠
博客等级 码龄15年 14粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值