struct和typedef struct彻底明白了,引用自https://www.cnblogs.com/qyaizs/articles/2039101.html

struct和typedef struct彻底明白了
struct和typedef struct

分三块来讲述:
  1 首先://注意在C和C++里不同
    在C中定义一个结构体类型要用typedef:
    typedef struct Student
    {
    int a;
    }Stu;
    于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)
    这里的Stu实际上就是struct Student的别名。Stu==struct Student
    另外这里也可以不写Student(于是也不能struct Student stu1;了,必须是Stu 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是一个结构体类型=struct Student

使用时可以直接访问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将是截然不同的三个对象。

//此处不是很理解。

typedef struct和struct的区别:

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

上面的tagMyStruct是标识符,MyStruct是变量类型(相当于(int,char等))。

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

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

struct tagMyStruct
    {  
     int iNum;
     long lLength;
    };

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

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

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

typedef struct tagMyStruct MyStruct;

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

2.

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

在C中,这个申明后申请结构变量的方法有两种:

(1)struct tagMyStruct 变量名

(2)MyStruct 变量名

在c++中可以有

(1)struct tagMyStruct 变量名

(2)MyStruct 变量名

(3)tagMyStruct 变量名

分类: 知识是积累滴~
好文要顶 关注我 收藏该文
bingo~
关注 - 5
粉丝 - 101
+加关注
78 1
posted @ 2011-05-06 16:31 bingo~ 阅读(550071) 评论(32) 编辑 收藏

发表评论
#1楼 2012-11-07 22:24 | -3-Lillian
好棒好棒~.
支持(1) 反对(0)
#2楼 2013-04-25 09:21 | xiren
还是没懂

引用
在C中定义一个结构体类型要用typedef:
    typedef struct Student
    {
    int a;
    }Stu;
    于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)
    这里的Stu实际上就是struct Student的别名。Stu==struct Student
    另外这里也可以不写Student(于是也不能struct Student stu1;了,必须是Stu stu1
;)
这就把我绕晕了
支持(5) 反对(2)
#3楼 2013-07-12 10:19 | 阳光很温暖
@ xiren
按我理解,意思就是:在C中,不用typedef,声明时必须struct Student stu1;用typedef,声明时就可以Student stu1。
支持(10) 反对(3)
#4楼 2013-11-29 09:47 | 东方晚来
很棒加上typedef struct Student
    {
     int a;
    }Stu, *pStu;指针说明就更好了
支持(5) 反对(0)
#5楼 2014-03-17 21:02 | 君子慎独不欺暗室
@ 东方晚来
typedef struct Student
    {
     int a;
    }Stu, pStu;
能否讲解下此处定义是什么意思?
支持(4) 反对(0)
#6楼 2014-04-07 11:47 | goodgirl_lin
@ 一直在
pStu是Stu类型的指针。
就像int
一样。
可以在后面定义:
Stu student;
pStu p;
p=&student;
支持(0) 反对(0)
#7楼 2014-06-26 16:58 | chaoking
很好,学习了!
支持(1) 反对(0)
#8楼 2014-10-24 21:36 | keloli
“typedef为这个新的结构起了一个名字,叫MyStruct。

typedef struct tagMyStruct MyStruct;

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

我也是这样理解的!
支持(2) 反对(0)
#9楼 2014-11-02 22:20 | —阿辉
不错
支持(0) 反对(0)
#10楼 2014-11-16 14:06 | Lee在路上
typedef struct tagMyStruct
    {
     int iNum;
     long lLength;
    } MyStruct;
在文章最后,像你说的,使用tagMyStruct+变量名,来定义一个结构体变量,编译通不过。。
支持(0) 反对(0)
#11楼 2014-11-16 14:15 | Lee在路上
对的,有C和C++的区别,换成C++就可以的了
支持(0) 反对(0)
#12楼 2014-12-03 17:02 | 银冰冷月
写的很好,正如名字,彻底明白了!
支持(1) 反对(0)
#13楼 2014-12-17 19:02 | Wamei
不错。懂了
支持(1) 反对(0)
#14楼 2015-02-26 10:11 | amleven
写的非常的不错,正对这一块迷迷糊糊呢!受教了
支持(1) 反对(0)
#15楼 2015-11-02 19:45 | 土豆排骨饭
赞,不愧是彻底明白
支持(1) 反对(0)
#16楼 2015-12-08 16:54 | gig886
个人感觉直接说说在这个地方C和C++的差异?以及为什么会有这些差异会更好?
支持(2) 反对(0)
#17楼 2016-03-31 20:44 | 阿胜4K
终于学到了。困扰了我,好久。
支持(0) 反对(0)
#18楼 2016-04-22 21:20 | cDoubleJ
真棒,解决了我的困惑
支持(0) 反对(0)
#19楼 2016-06-12 15:07 | 皮特99
点赞!
  2.其次:
    在c++中如果用typedef的话,又会造成区别:
    struct Student
    {
    int a;
    }stu1;//stu1是一个变量

typedef struct Student2
    {
    int a;
    }stu2;//stu2是一个结构体类型=struct Student

使用时可以直接访问stu1.a
    但是stu2则必须先 stu2 s2;
    然后 s2.a=10;
struct 在c++ 相当于一个只有 public 成员的一个类
支持(2) 反对(0)
#20楼 2016-09-02 10:28 | 巴迪大大wo
typedef struct
{
int year,month,day;
}Date;
struct Date{
int year,month,day;
};
struct Student
{
char id[10],name[10];
int age;
Date date;
};
为什么要先typedef Date 然后再struct Date,是什么意思?而且缺少还不可以
支持(1) 反对(0)
#21楼 2016-10-17 17:50 | 小陈同学啦
没懂,我还是没搞懂c和c++下的区别
支持(1) 反对(0)
#22楼 2016-10-18 14:29 | 小陈同学啦
今天又通读一遍。博主真厉害,受益匪浅啊
支持(0) 反对(0)
#23楼 2017-04-30 09:57 | 阿楞丶
分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,不论是否有typedefstruct 关键字和tagMyStruct一起,构成了这个结构类型,这个结构都存在。
  我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。
代码1
#include<stdlib.h>
#include
using namespace std;

struct tagMyStruct
{
int iNum=1;
long lLength=2;
};

int main(void)
{
struct tagMyStruct s1;

cout <<s1.iNum << endl;
system(“pause”);
return 0;
}
代码2
#include<stdlib.h>
#include
using namespace std;

struct tagMyStruct
{
int iNum=1;
long lLength=2;
};

int main(void)
{
tagMyStruct s1;

cout <<s1.iNum << endl;
system(“pause”);
return 0;
}
这两个代码在vs中的运行结果一样博主在其次的讲解中与在分析中的讲解有点矛盾。
支持(0) 反对(0)
#24楼 2017-07-06 14:41 | mujia
@ Romama
我也一直不懂这种表达方式
支持(0) 反对(0)
#25楼 2017-09-21 18:29 | ArvinShaffer
谢谢博主,简单的说明了情况
支持(0) 反对(0)
#26楼 2017-10-27 00:29 | 粉青哥哥
@ 阳光很温暖 用了typedef,意思就是把原来的结构体变量名struct Student换了一个名字Stu,所以就只能用Stu s1;了,而不能直接Student s1;
支持(0) 反对(0)
#27楼 2017-10-27 01:09 | 粉青哥哥
看了楼主的讲解,我总结了一下:
C和C++在结构体上的区别:
C中,定义一个结构体变量必须要用typedef(只有这一种方式):
typedef struct Student
{
int a;
float b;
}Stu;
Stu s1;
s1.a=1;
s1.b=2.2;

而在C++中,有两种方式,
方式一:不需要typedef即可定义
struct Student
{
int a;
float b;
}Stu;
Stu.a=1;
Stu.b=2.2;
可以直接用Stu.a;而不需要Stu s1;然后再s1.a;

方式二:用typedef定义
typedef struct Student
{
int a;
float b;
}Stu1;
Stu1 stu1;
stu1.a=1;
stu1.b=2.2;

其实,只要用了typedef,C、C++用法都一样,只是C++多了一种方式而已。
支持(0) 反对(0)
#28楼 2019-03-06 08:34 | 就是讲什么话都可以
mark
支持(0) 反对(0)
#29楼 2019-03-08 09:50 | zongzi10010
纠正一下吧,C语言也是可以直接定义变量的

struct Student
{
int a;
float b;
}Stu;

这就是定义了一个变量stu,类型为struct Student
我没看出来C 和C++ 中的区别
支持(1) 反对(0)
#30楼 2019-04-16 12:01 | 模式识别中心主任
赞赞赞
支持(0) 反对(0)
#31楼 2019-06-06 21:32 | 18121792013
真的很赞 ,已懂
支持(0) 反对(0)
#32楼 2019-07-31 15:41 | dazhouwentao
赞同,已懂
支持(0) 反对(0)
刷新评论刷新页面返回顶部
注册用户登录后才能发表评论,请 登录 或 注册, 访问 网站首页。
【推荐】超50万C++/C#源码: 大型实时仿真组态图形源码
【活动】京东云限时优惠1.5折购云主机,最高返价值1000元礼品!
【推荐】零基础轻松玩转华为云产品,获壕礼加返百元大礼
【推荐】919 天翼云钜惠,全网低价,云主机9元轻松购
【推荐】华为云文字识别资源包重磅上市,1元万次限时抢购
【推荐】腾讯云海外云服务器1核2G19.8元/月
【福利】git pull && cherry-pick 博客园&华为云百万代金券

最新 IT 新闻:
· 首次亮相中国:希捷全线新SSD登场
· 比尔·盖茨捐赠超350亿美元:但财富丝毫不受影响
· 我国突破高速磁浮列车“动力心脏”关键技术
· 规模2500万港元 小米集团时隔两个月再开启股票回购
· 无需使用抗排斥药物 新方法让植入大脑的干细胞长期存活
» 更多新闻…

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值