struct和typedef struct

合集下载

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

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详解

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”类型重定义的解决办法

“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中常见数据类型介绍

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章 结构体

c语言第10章 结构体
第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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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将是
截然不同的三个对象。

相关文档
最新文档