struct与typedef struct的区别

2023-11-13

typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。

具体区别在于:
若struct node {}这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;
若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;
区别就在于使用时,是否可以省去struct这个关键字。

一、struct和typedef struct的区别

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;

总结:在c++中可以不需要typedef就可以Student stu2是因为在c++中struct也是一种类,

           所以可以直接使用Student stu2来定义一个Student的对象,但c中去不可以。
===========================================
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将是截然不同的三个对象。

二、C/C++中typedef struct和struct的用法

struct _x1 { ...}x1; 和 typedef struct _x2{ ...} x2; 有什么不同?

其实, 前者是定义了类_x1和_x1的对象实例x1, 后者是定义了类_x2和_x2的类别名x2 ,

所以它们在使用过程中是有取别的.请看实例1.

[知识点]

结构也是一种数据类型, 可以使用结构变量, 因此, 象其它 类型的变量一样, 在使用结构变量时要先对其定义。

定义结构变量的一般格式为:

struct 结构名

{

类型 变量名;

类型 变量名;

...

} 结构变量;

结构名是结构的标识符不是变量名。

另一种常用格式为:

typedef struct 结构名

{

类型 变量名;

类型 变量名;

...

} 结构别名;

另外注意: 在C中,struct不能包含函数。在C++中,对struct进行了扩展,可以包含函数。

======================================================================

实例1: struct.cpp

#include <iostream>

using namespace std;

typedef struct _point{

int x;

int y;

}point; //定义类,给类一个别名

struct _hello{

int x,y;

} hello; //同时定义类和对象

int main()

{

point pt1;

pt1.x = 2;

pt1.y = 5;

cout<< "ptpt1.x="<< pt1.x<< "pt.y="<< pt1.y<< endl;

//hello pt2;

//pt2.x = 8;

//pt2.y =10;

//cout<<"pt2pt2.x="<< pt2.x<< "pt2.y="<<pt2.y<< endl;

//上面的hello pt2;这一行编译将不能通过. 为什么?

//因为hello是被定义了的对象实例了.

//正确做法如下: 用hello.x和hello.y

hello.x = 8;

hello.y = 10;

cout<< "hellohello.x="<< hello.x<< "hello.y="<< hello.y<< endl;

return 0;

}

三、问答

Q: 用struct和typedef struct 定义一个结构体有什么区别?为什么会有两种方式呢?

struct Student
{
int a;
} stu;
typedef struct Student2
{
int a;
}stu2;

A:

事实上,这个东西是从C语言中遗留过来的,typedef可以定义新的复合类型或给现有类型起一个别名,在C语言中,如果你使用
struct xxx
{
}; 的方法,使用时就必须用 struct xxx var 来声明变量,而使用
typedef struct
{
}的方法 就可以写为 xxx var;
不过在C++中已经没有这回事了,无论你用哪一种写法都可以使用第二种方式声明变量,这个应该算是C语言的糟粕。

用法小结

第一、四个用途

用途一:

定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量;
以下则可行:
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针
虽然:
char *pa, *pb;
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。

用途二:

用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如:
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;

而在C++中,则可以直接写:结构名 对象名,即:
tagPOINT1 p1;

估计某人觉得经常多写一个struct太麻烦了,于是就发明了:
typedef struct tagPOINT
{
int x;
int y;
}POINT;

POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候

或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

struct与typedef struct的区别 的相关文章

  • 类 VS 引用结构

    我正在使用 C 编写游戏 因此 我非常关心性能 我想知道主要区别是什么 如果可能的话 使用类传递数据或通过引用传递结构的性能考虑因素 出于性能原因 我希望不要复制数据 我假设通过 ref 传递比这里通过值传递要快得多 我知道类始终通过引用传
  • 为什么最好使用 Glib 数据类型(例如 `gint` 而不是 `int`)? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么glib要重新定义类型 https stackoverflow com questions 1819561 why does glib redefine types 在 GTK 2 0 教程中
  • 初始化一个结构,其成员是另一个结构的数组[重复]

    这个问题在这里已经有答案了 I have include
  • Pickling 定义为具有 PyObject* 成员的 C 结构的 Python 扩展类型

    我正在通过 Python 运行 C 代码 并且想要 pickle 扩展类型 因此 我有一个 C 结构体 py db manager 其中包含指向数据库对象和对象管理器对象 均用 C 编写 的指针 我用 python 类型对象 t db ma
  • 如何将异步函数存储在结构中并从结构实例调用它?

    我正在尝试用新的方法来实现这一目标async await句法 std future Futures 和最新版本的 Tokio 我正在使用东京0 2 0 alpha 4和铁锈1 39 0 nightly 我尝试过的不同事情包括 using B
  • C 中的结构体数组初始化

    这是我的代码的一部分 我只想初始化arraylist 0 as arraylist 0 x 0 and arraylist 0 y 0 我不需要初始化结构体数组的其余部分 我该怎么做 谢谢 include
  • 如何将Matlab命令的输出重定向到文件? [复制]

    这个问题在这里已经有答案了 我想将 Matlab 命令的输出重定向或复制到文件中 我怎样才能做到这一点 就我而言 我想使用 UNIX 工具比较两个大型结构diff 示例 我可以在 Matlab 中执行此操作 gt gt s1 s1 a 32
  • sizeof() 函数如何用于 C 中的结构?

    结构体定义如下 typedef struct Sample int test char strtest Sample 在Main Function中 我将结构体称为Sizeof sizeof struct Sample 我听说结构体上 si
  • 继承而不是 typedef

    C 无法从 typedef 中创建模板或将 typedef 制作为模板类 我知道如果我继承并使我的类成为模板 它就会起作用 例子 Illegal template
  • 解码子级时访问嵌套 Codable 结构中父级结构的属性

    在嵌套中使用解码器时Codablestruct 有什么方法可以访问父结构的属性吗 我能想到的唯一可行的方法 尚未测试 是在父结构中也使用手动解码器 在userInfo字典 然后访问userInfo在子结构中 但这会产生大量样板代码 我希望有
  • 多个结构体,需要在方法中访问相同的字段

    我目前尝试用 C 语言编写一些简单的控制台游戏来娱乐 为此 我需要能够在 嗯 C 中打印类似窗口的结构 我想使用通用渲染方法 让我们称之为frame render 渲染所有不同的 ui 元素 现在的问题是 如何解决这个问题 给定场景 The
  • 如何可视化内存中带有位域的 C 结构体的布局?

    我正在使用包括位字段的 C 结构 如下所示 struct beeper general t uint1 t enable 1 uint32 t 7 enum2 t loudness 2 uint32 t 22 enum2 t status
  • C 标准中 char 数组结构成员的对齐

    假设我想读 写 tar 文件头 考虑标准 C C89 C99 或 C11 关于填充 字符数组在结构中是否有任何特殊处理 编译器可以向这样的结构添加填充吗 struct header char name 100 char mode 8 cha
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 如何让 C# 设计器编辑我的结构属性?

    我正在使用 C 创建一个具有多个自定义属性的自定义 Windows 窗体控件 这些属性之一是一个带有几个整数字段的简单结构 public struct Test public int A B Test Test Category MyCat
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req
  • 模板化的 typedef?

    我正在使用 libgc 一个用于 C 和 C 的垃圾收集器 为了使 STL 容器可被垃圾回收 必须使用 gc allocator 而不是写作 std vector
  • 结构体实现接口安全吗?

    我似乎记得读过一些关于在 CLR 中通过 C 实现结构如何不好的内容 但我似乎找不到任何相关内容 是不是很糟糕 这样做会产生意想不到的后果吗 public interface Foo Bar GetBar public struct Fub

随机推荐

  • Latex三线表绘制横线

    目前遇到两种方式 toprule midrule bottomrule usepackage booktabs begin table htb caption Table caption label t1 begin tabular ll
  • 【C++深陷】之“lambda表达式”

    0 什么是lambda表达式 C Primer 第5版 对 lambda表达式 lambda expression 的定义为 一个lambda表达式表示一个可调用的代码单元 我们可以将其理解为一个未命名的内联函数 lambda表达式的形式如
  • python实现excel Vlookup功能

    python 如何实现Excel 的Vlookup功能 1 Excel 中VLOOKUP具体步骤 2 Python中使用pandas包中的pd merge 来实现 1 Excel 中VLOOKUP具体步骤 Excel 中的VLOOKUP使用
  • DDC-数字下变频的FPGA实现

    在数字信号处理中常常用到DDC 这是因为在雷达数字信号处理中运算速度是一个非常关键的指标 虽然我们可以在中频直接对信号进行处理 但是这样就会造成一个不好的影响就是运算量大 FPGA消耗的资源多相应的产品成本也就高了 这就是一切的初衷 首先呢
  • 弱人工智能才是未来AI研究的主流方向

    关于人工智能 长期存在两种不同的目标或者理念 一种是希望借鉴人类的智能行为 研制出更好的工具以减轻人类智力劳动 一般称为 弱人工智能 类似于 高级仿生学 另一种是希望研制出达到甚至超越人类智慧水平的人造物 具有心智和意识 能根据自己的意图开
  • crmeb 前端源码uniapp编译成微信小程序上传开发工具教程

    1 下载登录微信开发工具 下载地址 https developers weixin qq com miniprogram dev devtools download html 推荐使用稳定版 安装完成后后 打开 微信扫码登陆 2 下载HBu
  • android用代码开启定位功能吗,Android判断定位功能是否开启

    定位功能是否可用由定位服务和定位权限共同决定 判断定位服务 author 程龙 date On 2018 8 13 手机是否开启位置服务 如果没有开启那么所有app将不能使用定位功能 public static boolean isLocS
  • 广播接收者两种注册方式及优缺点

    两种注册方式 静态注册 在清单文件中配置
  • Spring websocket+Stomp+SockJS 实时通信详解

    一 三者之间的关系 Http连接为一次请求 request 一次响应 response 必须为同步调用方式 WebSocket 协议提供了通过一个套接字实现全双工通信的功能 一次连接以后 会建立tcp连接 后续客户端与服务器交互为全双工方式
  • vue中tab页签切换导致echarts被压缩的问题

    问题描述 vue中使用tab进行页签切换 echarts图表的宽度设为100 的情况下 图表出现压缩变形的情况 解决方案 1 设置静态的宽度 使用vm单位来设置宽度 vm与 的区别 两个效果大致相同 对于父元素 vm 对于浏览器 2 v i
  • 【华为OD机试真题 JS】一种字符串压缩表示的解压

    标题 一种字符串压缩表示的解压 时间限制 1秒 内存限制 262144K 语言限制 不限 有一种简易压缩算法 针对全部由小写英文字母组成的字符串 将其中连续超过两个相同字母的部分压缩为连续个数加该字母 其他部分保持原样不变 例如 字符串 a
  • 厉害|百度28位离职技术大牛和他们创建的AI公司!

    转自 https www sohu com a 168170780 642762 全球人工智能 拥有十多万AI技术用户 核心用户来自 北大 清华 中科院 麻省理工 卡内基梅隆 斯坦福 哈佛 牛津 剑桥 以及谷歌 腾讯 百度 脸谱 微软 阿里
  • C++(一) --圆的面积

    求圆的面积 include
  • matlab里的CreateQueue,MATLAB 实现队列(FIFO)

    创建 先进先出 FIFO 队列 queue 类的全过程 在本例中 读者应充分注意 构架域 Fields of a structure array 和定义在其上的方法函数 Method function 之间的关系 1 建立类目录 queue
  • rem和em的区别

    相对于font size em针对父元素的font size rem针对于根元素 html 元素的font size
  • LeetCode二维数组例题(原地旋转和对角线遍历)-c语言

    二维数组例题 二维数组 矩阵旋转 原地旋转 对角线遍历 二维数组 矩阵旋转 原地旋转 方法一 四个角是一个循环 引申到四个块是循环 n为偶数时 枚举n2 4个位置 n为奇数时 枚举 n2 1 4个位置 void rotate int mat
  • 吊打面试官系列之:进阶必会Docker命令大全,怎么跟我想象的不一样,简直太easy了。

    Docker必会操作命令 1 引言 2 基本命令 3 镜像命令 3 1 基本操作 3 1 1 查看本地镜像 3 1 2 下载镜像 3 1 3 删除non镜像 3 1 4 制作镜像 3 2 拉取最新镜像 3 3 发布镜像 4 容器命令 4 1
  • React Native_手把手教你做项目(五.下拉刷新RefreshControl&封装自定义Cell)

    接下来我们继续下拉刷新的功能 主要是缓存数据的拼接与后台服务器的配合 把数据最后的id传给后台 后台根据id返回给你新的id之后的数据 因为没有服务器 所以这里的代码仅仅做演示使用 下拉刷新RefreshControl list js im
  • chrome同步或登录报错:Request Canceled

    原因 因为某个接口连接失败造成 可以摁快捷键F12或者点击开发者工具 然后选择network 这里面是该页面所有的收发请求 开始登录 登录的时候要注意network中pending或者报错的接口 然后把域名记录下来 解决方式 安装chrom
  • struct与typedef struct的区别

    typedef是类型定义的意思 typedef struct 是为了使用这个结构体方便 具体区别在于 若struct node 这样来定义结构体的话 在申请node 的变量时 需要这样写 struct node n 若用typedef 可以