struct和typedef struct
typedef 声明,简称 typedef,为现有类型创建一个新的名字。

typedef 声明,简称typedef,为现有类型创建一个新的名字。
比如人们常常使用typedef 来编写更美观和可读的代码。
所谓美观,意指typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。
本文下面将竭尽全力来揭示typedef 强大功能以及如何避免一些常见的陷阱。
如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?使用typedefs 为现有类型创建同义字。
定义易于记忆的类型名typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。
类型出现在所声明的变量名字中,位于''typedef'' 关键字右边。
例如:typedef int size;此声明定义了一个int 的同义字,名字为size。
注意typedef 并不创建新的类型。
它仅仅为现有类型添加一个同义字。
你可以在任何需要int 的上下文中使用size:void measure(size * psz);size array[4];size len = file.getlength();std::vector vs;typedef 还可以掩饰符合类型,如指针和数组。
例如,你不用象下面这样重复定义有81 个字符元素的数组:char line[81];char text[81];定义一个typedef,每当要用到相同类型和大小的数组时,可以这样:typedef char Line[81];Line text, secondline;getline(text);同样,可以象下面这样隐藏指针语法:typedef char * pstr;int mystrcmp(pstr, pstr);这里将带我们到达第一个typedef 陷阱。
标准函数strcmp()有两个‘const char *'类型的参数。
因此,它可能会误导人们象下面这样声明mystrcmp():int mystrcmp(const pstr, const pstr);这是错误的,按照顺序,‘const pstr'被解释为‘char * const'(一个指向char 的常量指针),而不是‘const char *'(指向常量char 的指针)。
C语言typedef详解

C语⾔typedef详解允许⽤户使⽤ typedef 关键字来定义⾃⼰习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与⽤户⾃定义的结构型名称、共⽤型名称、枚举型名称等。
⼀旦⽤户在程序中定义了⾃⼰的数据类型名称,就可以在该程序中⽤⾃⼰的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。
例如,C 语⾔在 C99 之前并未提供布尔类型,但我们可以使⽤ typedef 关键字来定义⼀个简单的布尔类型,如下⾯的代码所⽰:1. typedef int BOOL;2. #define TRUE 13. #define FALSE 0定义好之后,就可以像使⽤基本类型数据⼀样使⽤它了,如下⾯的代码所⽰:1. BOOL bflag=TRUE;typedef的4种⽤法在实际使⽤中,typedef 的应⽤主要有如下4种。
1) 为基本数据类型定义新的类型名也就是说,系统默认的所有基本类型都可以利⽤ typedef 关键字来重新定义类型名,⽰例代码如下所⽰:1. typedef unsigned int COUNT;⽽且,我们还可以使⽤这种⽅法来定义与平台⽆关的类型。
⽐如,要定义⼀个叫 REAL 的浮点类型,在⽬标平台⼀上,让它表⽰最⾼精度的类型,即:1. typedef long double REAL;在不⽀持 long double 的平台⼆上,改为:1. typedef double REAL;甚⾄还可以在连 double 都不⽀持的平台三上,改为:1. typedef float REAL;这样,当跨平台移植程序时,我们只需要修改⼀下 typedef 的定义即可,⽽不⽤对其他源代码做任何修改。
其实,标准库中⼴泛地使⽤了这个技巧,⽐如 size_t 在 V2010 的 crtdefs.h ⽂件中的定义如下所⽰:1. #ifndef _SIZE_T_DEFINED2. #ifdef _WIN643. typedef unsigned __int64 size_t;4. #else5. typedef _W64 unsigned int size_t;6. #endif7. #define _SIZE_T_DEFINED8. #endif2) 为⾃定义数据类型(结构体、共⽤体和枚举类型)定义简洁的类型名称以结构体为例,下⾯我们定义⼀个名为 Point 的结构体:1. struct Point2. {3. double x;4. double y;5. double z;6. };在调⽤这个结构体时,我们必须像下⾯的代码这样来调⽤这个结构体:1. struct Point oPoint1={100,100,0};2. struct Point oPoint2;在这⾥,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上⾯的调⽤⽅法⼀样有保留字 struct,⽽不能像 int 和 double 那样直接使⽤ Point 来定义变量。
“struct”类型重定义的解决办法

“struct”类型重定义的解决办法我在使⽤VS 2013 编写⼀个头⽂件代码内容如下:1// 这个⽂件的名称为Common.h2 typedef struct tagMSGINFO //传输消息结构体3 {4// int messageType;5int messageID;6 BYTE transData[1024 * 5];7 }MSGINFO_SERVER;89 typedef struct tagMSGTYPE10 {11int messageType;12 }MSGTYPE_SERVER;1314 typedef struct tagSYSTEMINFO15 {16int os;17bool Cam; //摄像头18double ver;19 }SYSTEMINFO_SERVER;2021 typedef struct tagDRIVER22 {23 wchar_t disk;24double all;25double free;26int type;27 }DRIVER;2829 typedef struct tagFILEINFO30 {31 TCHAR FileName[256];32int type;33 __int64 size;34 }FILEINFO;3536 typedef struct tagDOWNFILEDATA37 {38 BYTE context[512]; // 每块的⼤⼩39 UINT size; // 从⽂件的那个位置开始传输40bool flag; // 是否传输完毕的标志41 UINT count; // 进度条要⽤到42 }DOWNFILEDATA;4344 typedef struct tagCMD //CMD命令信息45 {46int flag;47char command[1024];48 }CMD;4950 typedef struct tagTASK51 {52 wchar_t TaskName[260];53 DWORD TaskID;54 wchar_t TaskPath[260];55bool flag;56 }TASK;575859 typedef struct tagBMPDATA60 {61 BITMAPINFO bmpheadinfo;62int Id; // 0--图像信息头 1--图像数据63bool Show; // 是否可以显⽰图像64int Size;65int HeadSize;66 UINT Begin;67 BYTE Data[5000];68 }BMPDATA;编译时出现了如下的错误:1 e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(20): error C2011: “tagMSGINFO”:“struct”类型重定义21> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(20) : 参见“tagMSGINFO”的声明31>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(27): error C2011: “tagMSGTYPE”:“struct”类型重定义41> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(27) : 参见“tagMSGTYPE”的声明51>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(32): error C2011: “tagSYSTEMINFO”:“struct”类型重定义 61> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(32) : 参见“tagSYSTEMINFO”的声明71>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(39): error C2011: “tagDRIVER”:“struct”类型重定义81> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(39) : 参见“tagDRIVER”的声明91>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(47): error C2011: “tagFILEINFO”:“struct”类型重定义101> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(47) : 参见“tagFILEINFO”的声明111>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(54): error C2011: “tagDOWNFILEDATA”:“struct”类型重定义121> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(54) : 参见“tagDOWNFILEDATA”的声明131>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(62): error C2011: “tagCMD”:“struct”类型重定义141> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(62) : 参见“tagCMD”的声明151>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(68): error C2011: “tagTASK”:“struct”类型重定义161> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(68) : 参见“tagTASK”的声明171>e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(81): error C2011: “tagBMPDATA”:“struct”类型重定义181> e:\vctest\romatecontrolserver2\romatecontrolserver2\comment.h(81) : 参见“tagBMPDATA”的声明出错的原因是因为你在多个类中引⽤了Common.h 这个⽂件,例如你在类A.h 中使⽤代码:1 #include "Common.h"⽽你在类B.h 中同样使⽤了代码:1 #include "Common.h"这样VS 就会对“Common.h” 这个⽂件进⾏再次编译,这样就会出现本⽂上边提到的问题,解决的办法很简单,只要在“Common.h” 这个⽂件的第⼀⾏添加如下代码:1#pragma once这个代码的意思是对该⽂件只会进⾏⼀次编译。
结构体变量和结构体类型的定义

结构体变量和结构体类型的定义1.结构体类型定义定义方式1:Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域} *LinkList;定义方式2:struct LNode { int data; // 数据域 struct LNode *next; // 指针域};Typedef struct LNode *LinkList;以上两个定义方式是等价的,是将*LinkList 定义为struct LNode 类型,即LinkList 被定义为一个类型名。
这样就可以用LinkList 来定义说明新的变量了,如:LinkList L;即将 L 定义为 struct LNode 类型的指针变量。
2.结构体类型变量定义定义方式1:struct LNode { int data; // 数据域 struct LNode *next; // 指针域}LnodeA;定义方式2:struct LNode { int data; // 数据域 struct LNode *next; // 指针域};struct LNode LnodeA;以上两个定义方式也是等价的,这样就将LnodeA 定义为一个struct LNode 类型的变量,即 LnodeA 为一个 struct LNode 类型的变量名。
结构体内标的定义方式1.结构体,透明表区,DATA ELEMENT,DOMAIN透明表是对一个物理表的逻辑描述,透明表里有许多字段,并且定义某些字段为 PRIMARY KEY,字段里又包含 DATA ELEMENT,用来描述语言属性和技术属性。
DATA ELEMENT 中又包含DOMAIN,它是定义数据类型和字段长度。
结构体一般是用来定义一个结构变量,有临时数据的储存,没有PRIMARY KEY,结构体里包含 COMPONENT 而不是 FIELD2.Internal table 中的属性分为三种LINE TYPE ,KEY,TABLE KIND。
SystemVerilog中常见数据类型介绍

SystemVerilog中常见数据类型介绍⼀、常见数据类型1)bit byte(8) int(32) shortint(16) longint(64)变量类型;2)logic 定义变量,四态0 1 Z X,代替reg,wire;3)void类型表⽰⽆存储;4)var关键字表⽰对象是⼀个变量,⽐如 var logic[7:0] a;5)静态变量 static ⾃动变量 automatic6)⽤户使⽤typedef⾃定义类型7)枚举数据类型 enum⼆、枚举类型enum的使⽤module FSM(input logic clock, resetN,output logic [3:0] control);enum logic[2:0] {WAITE=3’b001,LOAD=3’b010,READY=3’b100} State, Next;always @(posedge clock, negedge resetN)if(!resetN) State <= WAITE;else State <= Next;always_comb begin$display(“\n Current state is %s (%b)”, , State);case (State)WAITE: Next = LOAD;LOAD: Next = READY;READY: Next = WAITE;endcase$display(“Next state will be %s (%b)”, ,Next);endassign control = State;endmodule三、结构体struct的介绍结构体struct⼀种变量集表⽰,它可以包括任何数据类型,可以集合不同类型和⼤⼩的变量、常量、⾃定义类型:定义结构体struct {int a,b;opcode_t opcode; //⽤户⾃⼰定义类型logic [23:0] address;bit error;} Instruction_Word (结构体名);instruction_word_t IW引⽤结构体:<结构体名>.<变量名>,如:Instruction_Word.address;结构体赋值:instruction_word_t IW = ’{100,3,8’hff,0};always @()IW.a = 100; IW.b = 5; IW.opcode = 8’hff; IW.address=0;四、联合体union介绍联合体union数据类型,和struct差不多,但是在内存分配机制上有些不同,union能够减少存储。
c语言第10章 结构体

李晓勇
lxyonghn@ 信息与电子工程学院
内容
结构体类型定义
结构体变量的定义 结构体变量的引用 结构体变量的初始化 结构数组 结构体和指针 结构体与函数 链表
C语言程序设计 - c语言第8章 结构体 语言第8
2
一, 结构体类型定义 结构体是一种构造数据类型 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-------自定义数据 用途:把不同类型的数据组合成一个整体 自定义数据 类型 结构体类型定义 struct [结构体名 结构体名] 结构体名 { 成员名; 类型标识符 成员名; 类型标识符 成员名; 成员名; ……………. }; ;
num 间接定义法 struct student { int num; char name[20]; char sex; int age; }; struct student stu[2]; 25B name sex age num name sex age stu[1] stu[0]
C语言程序设计 - c语言第8章 结构体 语言第8
C语言程序设计 - c语言第8章 结构体 语言第8
13
六, 结构体和指针
指向结构体变量的指针
定义形式: 结构体指针名; 定义形式:struct 结构体名 *结构体指针名 结构体指针名
例 struct student *p; 使用结构体指针变量引用成员形式 struct (*结构体指针名 成员名 结构体指针名).成员名 结构体指针名->成员名 结构体变量名.成员名 结构体指针名 student 结构体指针名 p成员名 结构体变量名 成员名 num { int num; name char name[20]; stu sex char sex; 例 int n; struct student stu1; int *p=&n; int age; age struct student *p=&stu1; *p=10; }; n=10 stu1.num=101; (*p).num=101 struct student stu ,*p=&stu; p->num=101
复习4--C结构体
};
定义一个学生的结构体
• 例如定义一个学生的结构体: struct student { int number; char name[15]; char sex; int age; }
• 成员又称为成员变量,是结构体中若干个数据类型, 每个成员须标明数据类型。
结构体类型的嵌套
• 结构体成员可以 是任意的数据类 型,还可以是其 它的结构体类型, 这时称为结构体 类型的嵌套。
struct date {
int year; int month; int day; }; struct person { int number; char name[20]; char sex; struct date birthday; };
结构体变量的定义
• 在定义了结构体之后,结构体变量可以用三种方式定义。 • 方式1: 先声明结构体类型,再定义变量名,分别定义。
共同体与结构体的不同
• 结构体变量所占内存是各成员占的内存长度之和。 • 而共同体变量所占内存长度是其中最长的成员的长度。 • 同一段内存段虽然可以存放几种不同类型的成员,但不
能同时存放,起作用的成员是最后一次存放的成员,在 存入一个新的成员后,原有的成员就被冲掉。 • 各成员的地址都是同一地址。
2)结构体类型与结构体数组同时定义
struct stu { long num; char name[10]; char sex; int age; }students[20]
3)直接定义结构体数组 而不用定义结构体类型名
struct { long num; char name[10]; char sex; int age; }students[20]
• 定义结构体变量students ,然后让这个指针p指向这个变 量,例如: struct stu students ; p=&students;
struct前加typedef在c语言中用法
struct前加typedef在c语言中用法
在C语言中,通过在struct前加上typedef关键字,可以创建一个新的类型别名。
这样做的目的是简化程序中的类型声明,使其更易读且易于维护。
具体用法如下:
```c
typedef struct {
int id;
char name[20];
float salary;
} Employee;
int main() {
Employee emp1;
emp1.id = 1;
strcpy(, "John Doe");
emp1.salary = 5000.00;
//使用新的类型别名进行声明和初始化
Employee emp2 = {2, "Jane Smith", 6000.00};
return 0;
}
```
在上面的代码中,我们创建了一个新的类型别名Employee,它实际上是一个结构体类型。
这样,我们就可以直接使用Employee来声明变量,并且可以像普通结构体一样访问其成员。
结构体的成员可以包含不同的数据类型,甚至可以包含其他结构体作为成员,以便构建更复杂的数据结构。
通过使用typedef,我们可以为这些结构体类型创建有意义的别名,使代码更具可读性。
当然,typedef不仅仅适用于结构体类型,还可以用于其他数据类型,如枚举、函数指针等。
使用typedef可减少代码的冗余,使代码更加清晰和易于维护。
C语言typedef的使用
C语言typedef的使用C语言typedef的使用typedef 关键字能帮助你简化复杂的定义并让你的代码简洁可靠,当然,可靠这一点我还是持保留态度,因人而异吧。
具体是如何使用呢?以下仅供参考!具体方法如下:C 语言提供typedef 关键字,允许你为已经存在的类型起一个新的名字,有一点需要注意,typedef 仅仅是为已经存在的类型创建了一个新的名字而已,不是创建新的类型。
首先将typedef 关键字放在前面,接着是已经存在的类型名,接着是新的名字:typedef existing_type new_name;举个例子,如果你想为unsinged integer 创建一个新的名叫score 的类型,你仅需要使用这样使用 typedef :typedef unsigned int score;后面你就可以使用“新类型” score 来声明变量,例如:score high_score;当然你还可以同时定义多个变量typedef int aaa, bbb, ccc;typedef int ar[15], arr[9][6];typedef char c, *cp, carr[100];/* 下面定义一些对象 *//* 都是int */aaa int1;bbb int2;ccc int3;ar yyy; /* 容量为15的整型数组 */arr xxx; /* 9*6 阶的整型数组 */c ch; /* 一个字符 */cp pnt; /* 指向字符的指针 */carr chry; /* 容量为100的字符数组 */C 语言 typedef 的使用这里来看一下使用typedef的好处,假如有一天你想将 unsigned int 修改成更大的数据类型,比如unsigned long,而此时你的很多代码文件都使用了unsigned int,如果没有使用typedef,你得到处都修改一遍,十分麻烦。
如果使用了之前的定义,这时只需修改score 一处就行,是不是很方便?另一个使用typedef 来增强可靠性的例子是size_t,size_t 是sizeof 操作符指定类型的大小,其基于目标处理器的运算能力而不是内存能力。
全国计算机二级c语言学习指南课件与历年真题精讲精析 第14章
二级C语言程序设计 学习指南与历年真题精讲精析
第14章 结构体、共用体和用户定义 类型
C语言中可由用户构造的两种数据类型:
1、结构体(struct)
2、共用体(union)
14.1 用typedef说明一种新类型名 1、C语言允许用typedef说明一种新类型名: typedef 类型名 标识符; 2、“类型名”必须是在此语句之前已有定义的类型标 识符,“标识符”是一个用户定义标识符,用作新的 类型名。typedef语句的作用仅仅是用“标识符”来
struct dent*s=&s[0]
则以下表达式中值为2的是_____。 (&s[0])->m s[0].m
B)*(p++)->m
C)(*p).m
*(&s[0])->m
s[0].m
*s[0].m
*&a
a
√
D)*((++p)->m)
*((&s[1])->m)
*s[1].m
*&b
五、函数之间结构体变量的数据传递 1、向函数传递结构体变量的成员 结构体变量中的每个成员可以是简单变量、数组或指针变量 等,作为成员变量,它们可以参与所属类型允许的任何操作。 2、向函数传递结构体变量 结构体变量作实参时,传递给函数对应形参的是它的值,函
}std,pers[3],* pstd; name sex birthday year month day sc[0] sc[1] sc[2] sc[3]
方法2:在说明一个无名结构体类型的同时,直接进行定义: 如:struct { char name[12]; char sex; struct date birthday; float sc[4];
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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将是
截然不同的三个对象。