typedef struct与struct

来源:互联网 发布:mysql delete语句用法 编辑:程序博客网 时间:2024/06/05 17:49

某位网友的理解:

**************************************************************************************************************************

我觉得把typedef struct和struct列在一起讲区别本身就不是很正确的思维方式 

typedef作为一个独立的关键字,顾名思义,起到的是一个"define type"的作用 

比如 typedef int my_int; 
你以后用int的地方就可以随便用my_int来替代 

在比如 typdef struct my_struct{int a, bool b} my_type; 
意思就是用my_type来表示struct my_struct 
比如你要申请内存空间了,你写malloc(sizeof(my_type))和malloc(sizeof(struct my_struct))效果是一样的,不过多少简化了一点代码 
如果你需要到指向my_type的指针,你还可以做typedef my_type* my_type_ptr; 
这样一来my_type_ptr mtp就等价于my_type *mtp,多少增强了代码的可读性与可维护性,不会因为可能忘了一个星号而头痛 

总的来说,把typedef和struct放在一起看作一个关键字(typedef struct)的思路是不正确的。 
格式:typedef <随便什么东西> name 是个整体 

**************************************************************************************************************************


第一篇:typedef struct与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)、规范做法:


typedef uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );


这个以前没有看到过,个人认为是宇定义一个uint32的指针函数,uint16*, uint32 为函数里的两个参数; 应该相当于#define uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );


struct在代码中常见两种形式: 
struct A 

//... 
};


struct 

//... 
} A; 
这其实是两个完全不同的用法: 
前者叫做“结构体类型定义”,意思是:定义{}中的结构为一个名称是“A”的结构体。 
这种用法在typedef中一般是: 
typedef struct tagA //故意给一个不同的名字,作为结构体的实名 

//... 
} A; //结构体的别名。


后者是结构体变量定义,意思是:以{}中的结构,定义一个名称为"A"的变量。这里的结构体称为匿名结构体,是无法被直接引用的。 
也可以通过typedef为匿名结构体创建一个别名,从而使得它可以被引用: 
typedef struct 

//... 
} A; //定义匿名结构体的别名为A


第二篇:在C和C++中struct和typedef struct的区别


在C和C++有三种定义结构的方法。


typedef struct {


int data;


int text;


} S1;


//这种方法可以在c或者c++中定义一个S1结构


struct S2 {


int data;


int text;


};


// 这种定义方式只能在C++中使用,而如果用在C中,那么编译器会报错


struct {


int data;


int text;


} S3;


这种方法并没有定义一个结构,而是定义了一个s3的结构变量,编译器会为s3内存。


void main()


{


S1 mine1;// OK ,S1 是一个类型


S2 mine2;// OK,S2 是一个类型


S3 mine3;// OK,S3 不是一个类型


S1.data = 5;// ERRORS1 是一个类型


S2.data = 5;// ERRORS2 是一个类型


S3.data = 5;// OKS3是一个变量


}


另外,对与在结构中定义结构本身的变量也有几种写法


struct S6 {


S6* ptr;


};


// 这种写法只能在C++中使用


typedef struct {


S7* ptr;


} S7;


// 这是一种在C和C++中都是错误的定义


如果在C中,我们可以使用这样一个“曲线救国的方法“


typedef struct tagS8{


tagS8 * ptr;


} S8;


第三篇: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;
===========================================
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语言的糟粕。



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绝地求生困在废车里怎么办 身体出现辅助睡眠状态怎么办 扁桃体发炎喉咙痒咳嗽怎么办 电脑玩英雄杀卡怎么办 康佳冰箱显示2e怎么办 高考登陆系统登录密码错误怎么办 苹果遇到ad登录问题怎么办? 小孩2天不拉屎怎么办 20天宝宝不大便怎么办 小孩几天不拉大便怎么办 宝宝经常不拉大便怎么办 宝宝便秘 肛裂了怎么办 3个月宝宝不便便怎么办 宝宝8个月不便便怎么办 宝宝在幼儿园不爱说话怎么办 广东学考考了d怎么办 上嘴唇干燥紧绷怎么办 美国大学gpa非常低怎么办 大学手机作弊通报教务处怎么办 崩坏3邮箱验证码过期怎么办 快递员被顾客恶意投诉怎么办 5岁幼儿逻辑思维差怎么办 脸一边胖一边瘦怎么办 夏天穿鞋子脚痒怎么办 脚痒怎么办但不是脚气 脚气脚趾缝烂了怎么办 凉鞋穿久了臭怎么办 运动鞋穿久了臭怎么办 体恤穿久了发臭怎么办 十七八岁青少年逆反心理怎么办 挨刚煮好的粥烫伤改怎么办? 5e的demo有水印怎么办 宝宝湿疹激素一停药复发怎么办 木工家装没事做怎么办 取票之后票丢了怎么办 补牙咬合低了点怎么办 留学生上美国网课上不了网怎么办 大四绩点不够2.0怎么办 ucas申请成绩下来后怎么办 在本校读研毕业东西怎么办 美国硕士gpa低于3.0怎么办