搜档网
当前位置:搜档网 › 结构体定义 typedef struct 用法详解和用法小结

结构体定义 typedef struct 用法详解和用法小结

结构体定义 typedef struct 用法详解和用法小结
结构体定义 typedef struct 用法详解和用法小结

结构体定义 typedef struct 用法详解和用法小结

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;

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

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

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=" <

//hello pt2;

//pt2.x = 8;

//pt2.y =10;

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

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

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

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

hello.x = 8;

hello.y = 10;

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

return 0;

}

第五篇:问答

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

struct Student

{

int a;

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;

};

struct tagPOINT1 p1;

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

tagPOINT1 p1;

估计某人觉得经常多写一个struct太麻烦了,于是就发明了:

typedef struct tagPOINT

{

int x;

int y;

}POINT;

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

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

typedef关键字用法 免费下载

typedef用法 1、为现有数据类型定义同义词 typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。 例如: typedef int size; 此声明定义了一个int的同义字,名字为size。注意typedef并不创建新的类型。 它仅仅为现有类型添加一个同义字。你可以在任何需要int的上下文中使用size: void measure(size*psz); size array[4]; 2、typedef还可以掩饰复合类型,如指针和数组 z数组 例如:typedef char Line[81];表示使用Line代表具有81个元素的char类型数组。如果要生成类似的数据可以使用如下形式:Line text,secondline; 相当于char test[81];char secondline[81]; z隐藏指针语法 例如:typedef char*pstr; int mystrcmp(pstr,pstr);相当于 int mystrcmp(char*,char*); 注意:标准函数strcmp()有两个‘const char*'类型的参数。因此,它可能会误导人们象下面这样声明mystrcmp(), int mystrcmp(const pstr,const pstr); 这是错误的,‘const pstr'被解释为‘const char*‘(一个指向char的常量指针),而不是‘char*'(指向char的指针)。 修改:添加,typedef const c pstr; 记住:不管什么时候,只要为指针声明typedef,那么都要在最终的typedef 名称中加一个const,以使得该指针本身是常量,而不是对象 z链表中应用 例如: typedef struct node {

结构体与共用体

试卷编号:825 所属语言:C语言 试卷方案:结构体与共用体 试卷总分:90分 共有题型:5种 ━━━━━━━━━━━━━━ 一、填空共5题(共计10分) ━━━━━━━━━━━━━━ 第1题(2.0分)题号:205 结构体是不同数据类型的数据集合,作为数据类型, 必须先说明结构体【1】,再说明结构体变量. 答案: =======(答案1)======= 类型 第2题(2.0分)题号:208 将函数funl 的入口地址赋给指针变量p的语句是【1】. 答案: =======(答案1)======= p=funl; 第3题(2.0分)题号:232 设有以下结构类型说明和变量定义,且sizeof(int)=2,则变量a在内存所占字节数是【1】. struct stud { char num[6]; int s[4]; double ave; } a,*p; 答案: =======(答案1)======= 22

第4题(2.0分)题号:345 若在程序中用到"strlen()"函数时,应在程序开头写上包含命令# include "【1】". 答案: =======(答案1)======= string.h 第5题(2.0分)题号:803 预处理命令行都必须以【1】号开始. 答案: =======(答案1)======= # ━━━━━━━━━━━━━━━━━ 二、单项选择共20题(共计40分) ━━━━━━━━━━━━━━━━━ 第1题(2.0分)题号:464 以下描述中,正确的是()。 A:预处理是指完成宏替换和文件包含中指定的文件的调用 B:预处理指令只能位于C源文件的开始 C:C源程序中凡是行首以#标识的控制行都是预处理指令 D:预处理就是完成C编译程序对C源程序第一遍扫描,为编译词法和语法分析作准备答案:C 第2题(2.0分)题号:472 下列程序运行结果为: #define P 3 #define S(a) P*a*a main() {int ar; ar=S(3+5); printf("\n%d",ar); } A:192 B:29 C:27

结构体与共用体小结

结构体与共用体小结 一,结构体得概念与定义 1,结构体得定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }; 这里数据类型可以就是复合类型,例如又就是一个结构体类型,即嵌套; 2,结构体变量得定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2;

或: struct { 数据类型成员名1; 数据类型成员名1; 、、、 }结构体变量1,结构体变量2; 三种方式,第三种方式得话,每次要定义这个类型得结构体变量都要重复得写这一段代码; 其实定义了结构体后,struct 结构体名就就是一种新得类型,上述语句就像声明变量一样; 3,结构体变量得引用 只能对结构体变量中得各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套得结构体类型得引用: 结构体变量名、结构体类型成员名、内嵌结构体得成员名; 4,结构体变量得初始化 struct 结构体名变量名= {初始化数据};

或者在定义得时候就初始化: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; 、、、 }变量名= {初始化数据}; 二,结构体数组 1,结构体数组得定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu;

char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量得三种形式就是一样得,只不过这里每次定义得结构体变量就是一个数组;每一个student[i]都就是struct stu类型得; 2,结构体数组得初始化与引用 略; 三,结构体与指针 1,指向结构体得指针得定义,同上,也就是三种形式; struct employees employee1,*p1; 或者: struct employees

结构体的使用方法

下面介绍了结构体的创建和使用方法: 创建过程: 定义一个名字为addr_t的结构体,其内容为名位addr的数组,数组大小为NET_ADDR_SIZE。 typedef struct { addr_t *addr;//地址 u8 *msg;//信息 u8 len;//信息长度 u8 port;//端口 } ioctlRawSend_t;//发送信息结构体 定义一个名字为ioctlRawSend_t的结构体,其内容为一个结构体,一个无符号类型指针和两个无符号数。将内容中的结构体代入这个结构体类型中,其内容可以写成(这样写只是为了看得更清晰) typedef struct { u8 addr[NET_ADDR_SIZE];//地址 u8 *msg;//信息 u8 len;//信息长度 u8 port;//端口 } ioctlRawSend_t;//发送信息结构体 这是一个联合体(共用体),很好理解,就是把两个结构体成员(ioctlRawSend_t,ioctlRawReceive_t)放在了一起用同一个名字(ioctl_info)表示,成员占用相同的内存单元,其中内容同步变化。 从变量观察窗口我们可以看到变量是如何组织在一起的。

到现在就从最基础的数组组成了一个联合体,下面我们使用它。 下面的语句中显示了如何向刚才建立的联合体中写要求的数据。 下面进行逐句分析 第一行中写广播地址(具体数字可以认为变动,一般为{0xFF,0xFF,0xFF,0xFF})到联合体中的 发送地址中。下面是变量窗口中发生的变化(红色表示变化)。

接下来的一句为向信息中填充内容,下面是变量观察窗口的变化。其中msg只显示0号元素,是因为它是一个指针,指向的是首地址,其实其他的内容也已经变化。

C语言的32个关键字意义与用法

C语言的32个关键字意义与用法 2009-11-20 13:19 1)auto 声明自动变量。可以显式的声明变量为自动变量,只要不是声明在所有函数文前的变量,即使没有加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值例如:auto int name=1 2)static: 声明静态变量。可以显式的声明量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍不还原。即使没有给静态变量赋值,它也会自动初始化为0,例:static int name=1 3)extern: 声明全局变量。用时声明在main函数之前的变量也叫全局变量。它可以在程序任何地方使用。程序运行期间它一直存在的。全局变量也会初始化为0,例:extern int name 4)register: 声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存寄存器中的,速度要快很多。对于需要频繁使用的变量,使用它来声明会提高程序运行速度。例: register int name=1 5)int: 声明量的类型。int为整数型。注意在16位和32位系统中它的范围是不用的。16位中占用2个字节;32位中占用4个字节。还可以显式的声明为无符号或有符号:unsigned int signed int.有符号和无符号的区别就是把符号也当作数字位来存储;也可以用short和long来声明为短整型或长整行例: int mum 6)float: 声明变量的类型。float浮点型,也叫实型。它的范围固定为4个字节。其中6位小数位,其他为整数位。例: float name 7)double: 声明为双精度类型。它的范围为8个字节,14位为小数位。也可使用更高精度的long double.它的范围则更大,达到10字节。例: double name 8)struct: 声明结构体类型。结构体可以包含各种不类型的量。比如可以把整型,字符型等类型的变量声明在同一个结构体种,使用的时候使用结构体变量直接可以调用。例: struct some{ int a=1; float b=1.1 double=1.1234567 }KKK;

结构体和共用体习题

习题六 1. 从下列四个选项中选择一个正确的填入括号中。 (1)在说明一个结构体变量时系统分配给它的存储空间是(D)。 A该结构体中第一个成员所需存储空间 B该结构体中最后一个成员所需存储空间 C该结构体中占用最大存储空间的成员所需存储空间 D该结构体中所有成员所需存储空间的总和 (2)在说明一个共用体变量时系统分配给它的存储空间是(D )。 A该共用体中第一个成员所需存储空间 B该共用体中最后一个成员所需存储空间 C该共用体中占用最大存储空间的成员所需存储空间 D该共用体中所有成员所需存储空间的总和 (3)共用体类型在任何给定时刻, (B)。 A所有成员一直驻留在内存中 B只有一个成员驻留在内存中 C部分成员驻留在内存中 D没有成员驻留在内存中 (4)以下定义结构体类型的变量st1,其中不正确的是(A ) A typedef stuct student { int num; int age; }STD; STD st1; B struct student { int num,age; }st1; C struct { int num; float age; }st1; D struct student { int num; int age; }; struct student st1; (5)已知职工记录描述为: struct workers {

int no; char name[20]; char sex; struct { int day; int month; int year; }birth; }; struct workers w; 设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是(C)。 A day=25; month=10; year=1993; B w.day=25w.month=10; w.year=1993; C w.birth.day=25; w.birth.month=10; w.birth.year=1993; D birth.day=25; birth.month=10; birth.year=1993; (6)设有如下定义: struct sk { int a; float b; }data,*p; 若有p=&data;则对data中的a成员的正确引用是(B)。 A (*p).data.a B (*p).a C p->data.a D p.data.a 2.填空 (1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是w[k-1].b、w[k-1].c 、w[k-1].d 。 struct aa { int b; char c; double d; }; struct aa w[10]; int k=3; (2)若有以下说明和定义,则对x.b成员的另外两种引用形式是x->b-> 和p.b. 。 struct st { int a; struct st *b; }*p, x;

typedef使用详解

typedef使用详解 1.再论typedef 1.1、如何轻松理解和应用typedef? typedef用最简单的话去诠释他,那么就是给类型取别名。但是牠并没有你想象的那么简单!举例:typedef int size;//那么int就有一个别名叫size了,以后size就和int这个类型是一样的用法了。 看到这里,如果你仅仅认为typedef不过如此,不就是把第一个参数(类型名),等同于第二个参数,这么简单。那你可能就会陷入困境。 比如看下面这个例子: typedef char Line[81]; 你能说Line[81]就是char的别名吗?这显然不对。它真正的含义是:Line类型即代表了具有81个元素的字符数组。那么Line t;就等同于char t[81];看到这里读者是否晕了?我们尝试把它放在一起看看。 typedef int size; //typedef行 int i; //原型行 size i; //应用行 同理: typedef char Line[81]; //typedef行 char t[81]; //原型行 Line t; //应用行 再举一个函数指针的例子: typedef int (*fun_ptr)(int,int); //typedef行 int (*fp)(int,int); //原型行 fun_ptr fp; //应用行 以上3个例子都有以下几个共同点: 1、“typedef行”和“原型行”相比,“typedef行”仅仅多个typedef而已。就函数指针的例子来说,其次,“typedef行”和“原型行”的根本区别在于:fun_ptr是类的别名,fp是该类的变量。 2、“原型行”和“应用行”,它们的编译结果是一样的。就函数指针的例子来说,他们都是创建了一个类型为int (*)(int,int)的函数指针fp。只是fun_ptr fp(应用行)比int (*fp)(int,int)(原型行)这种形式更加简洁,便与书写和理解。形式越复杂typedef 的优势就越明显。 Typedef的定义应用和理解应该是一步到位的。 定义过程:只要我们能写出原型行,就能直接写出typedef行。应为形式上只差一个typedef。如:我们写出原型:char t[81],那么加上一个typedef就能得到我们想要的定义,当然可以修改下类名,如:typedef char T[81]。 应用过程:T t;其中T是之前定义的类型,t是通过该类型定义的变量。 理解过程:如何理解“T t;”要想理解“T t;”就找到与之对应的“原型行”,但是“原型行”一般在程序中是不会出现,所以只能先找到“typedef行”,在通过“typedef行”推出“原型行”(推的过程就是去掉typedef而已)。 “T t;”的“typedef行”为typedef char T[81],所以“T t”所表示的“原型行”就是char x[81],而“原型行”和“应用行”(这里“T t;”就是应用行),的含义完全相同。那么对“T t;”的理解就是对char x[81]的理解。 在“T t”的定义中,T的typedef定义形式为:

练习题-第十章 结构体与共用体(有答案)

一、填空题 1.若有如下结构体定义: struct student { int num; float age; char sex; }stud; 则stud所占的内存空间是9 字节。 2.已有定义和语句: union data { int i; char c; float f; }a,*p; p=a; 则对a中成员c的正确访问形式可以是 a.c 或: p->c或:(*p).c。(只需 写出一种) 二、单项选择题: 1.若有下列定义: struct b { float a[5]; double c; int d;}x; 则变量x在内存中所占的字节为下列哪一个:( C ) A.6 B. 10 C. 30 D. 14 2.设有以下说明语句,则下面的叙述不正确的是( C ) struct stu { int a; float b; } stutype; A. struct 是结构体类型的关键字。 B. struct stu 是用户定义的结构体类型。 C. stutype是用户定义的结构体类型名。 D. a和b都是结构体成员名。 3.下面程序的运行结果是( ) #include main( ) { struct date { int year, month, day;

}today; printf(“%d\n”,sizeof(struct date)); } A. 6 B. 8 C. 10 D. 12 4.设有以下说明语句,则下面的叙述正确的是( B ) typedef struct { int a; float b; } stutype; A. stutype是结构体变量名。 B. stutype 是结构体类型名。 C. struct是结构体类型名。 D. typedef struct是结构体类型名。 三、填程序 1.结构数组中存有三人的姓名和年龄,以下程序输出三人中最年长者的姓名和年龄。请填 空。 static struct man { char name[20]; int age; }person[ ]={{“LiMing”,18},{“WangHua”,19},{“ZhangPing”,20}}; main( ) { struct man *p,*q; int old=0; p=person; for(; p age){ q=p; old=p->age ;} printf(“%s %d”, q->name,q->age ); }

结构体与联合体习题含答案

2013年结构体与联合体习题 选择题 1、若程序中有以下的说明和定义: struct abc { int x;char y; } 花括号后少了分号。 struct abc s1,s2; 则会发生的情况是______。 A) 编译时错B) 程序将顺序编译、连接、执行 C) 能顺序通过编译、连接、但不能执行D) 能顺序通过编译、但连 接出错 2、有以下程序段 struct st { int x; int *y;}*pt; int a[]={1,2};b[]={3,4}; struct st c[2]={10,a,20,b}; pt=c; 以下选项中表达式的值为11的是 A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x 3、有以下说明和定义语句 struct student { int age; char num[8];}; struct student stu[3]={{20,"200401"},{21,"200402"},{19,"200403"}}; struct student *p=stu; 以下选项中引用结构体变量成员的表达式错误的是______。 A) (p++)->num B) p->num C) (*p).num D) stu[3].age 4、设有如下枚举类型定义 enum language {Basic=3,Assembly=6,Ada=100,COBOL,Fortran}; 枚举量Fortran的值为______。 A) 4 B) 7 C) 102 D) 103 5、以下叙述中错误的是_________。 A)可以通过typedef增加新的类型 B)可以用typedef将已存在的类型用一个新的名字来代表 C)用typedef定义新的类型名后,原有类型名仍有效 D)用typedef可以为各种类型起别名,但不能为变量起别名 6、有以下程序段 typedef struct NODE

结构体的定义及初始化

?结构体类型定义 struct [结构体名] { 类型标识符成员名; 类型标识符成员名; ……………. };成员类型可以是基本型或构造型 struct是关键字,不能省略合法标识符 可省:无名结构体 结构体的说明及结构体变量的定义

例struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; name num sex age score addr 2字节 2字节 20字节 1字节 4字节 30字节 … ….. 结构体类型定义描述结构 的组织形式,不分配内存 例子图解

?结构体类型定义 struct [结构体名] { 类型标识符成员名; 类型标识符成员名; ……………. };成员类型可以是基本型或构造型 struct是关键字,不能省略合法标识符 可省:无名结构体 结构体的说明及结构体变量的定义

(1) 在结构体说明的同时定义结构体变量,例如:struct example { char *name; int age; }guo,zhang;(2)直接定义结构体变量,例如: struct {char *name; int age; }guo,zhang 未给 出结 构体 名 (3) 把定义和说明分开,例如:struct example { char *name; int age; }; struct example guo,zhang;结构体变量占用内存的大小可用sizeof()运算来求出 ?结构体变量的定义

结构体的说明及结构体变量的定义?变量说明形式 struct 结构体名结构体变量名; ?注意: 结构变量的存储类型概念、它的寿命、可见 性及使用范围与普通变量、数组等完全一致。 结构体变量说明必须在结构类型定义之后, 二者也可同时进行。

C语言中typedef用法

[编辑本段] C语言中typedef用法 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来定义变量,但要注意,使用tagMy Struct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。 2) typedef为这个新的结构起了一个名字,叫MyStruct。 typedef struct tagMyStruct MyStruct; 因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct var Name来定义变量。 答案与分析 C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。 根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNo de。 解决这个问题的方法有多种: 1)、 typedef struct tagNode { char *pItem; struct tagNode *pNext; } *pNode; 2)、 typedef struct tagNode *pNode; struct tagNode { char *pItem; pNode pNext; }; 注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。 3)、规范做法: struct tagNode { char *pItem; struct tagNode *pNext; }; typedef struct tagNode *pNode; 3. typedef & #define的问题

结构体与共用体小结

结构体与共用体小结 一,结构体的概念和定义 1,结构体的定义 struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }; 这里数据类型可以是复合类型,例如又是一个结构体类型,即嵌套; 2,结构体变量的定义 struct 结构体名变量名1,变量名2,,,变量名n; 或: struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }结构体变量1,结构体变量2;

或: struct { 数据类型成员名1; 数据类型成员名1; ... }结构体变量1,结构体变量2; 三种方式,第三种方式的话,每次要定义这个类型的结构体变量都要重复的写这一段代码; 其实定义了结构体后,struct 结构体名就是一种新的类型,上述语句就像声明变量一样; 3,结构体变量的引用 只能对结构体变量中的各个成员分别输出,不能对一个结构体变量作为一个整体输出; 嵌套的结构体类型的引用: 结构体变量名.结构体类型成员名.嵌结构体的成员名; 4,结构体变量的初始化 struct 结构体名变量名= {初始化数据};

或者在定义的时候就初始化:struct 结构体名 { 数据类型成员名1; 数据类型成员名1; ... }变量名= {初始化数据}; 二,结构体数组 1,结构体数组的定义举例struct stu { int stu_nu; char name[20]; float score; }; struct stu student[5]; 或者: struct stu { int stu_nu;

char name[20]; float score; }student[5]; 或者: struct { int stu_nu; char name[20]; float score; }student[5]; 跟定义结构体变量的三种形式是一样的,只不过这里每次定义的结构体变量是一个数组;每一个student[i]都是struct stu类型的; 2,结构体数组的初始化和引用 略; 三,结构体与指针 1,指向结构体的指针的定义,同上,也是三种形式; struct employees employee1,*p1; 或者: struct employees

c语言结构体与共用体之间的区别

https://www.sodocs.net/doc/a0567351.html,/2005/03/25/12365.html 所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为: union 共用体名 {成员表列}; 7.5.1 共用体的定义 union data { int a ; float b ; d o u b l e c ; c h a r d ; } obj; 该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。 [例7 - 8 ] union data /*共用体* / { int a; float b; double c; char d; } m m ; struct stud /*结构体* / { int a; float b; double c; char d; } ; m a i n ( ) { struct stud student printf("%d,%d",sizeof(struct stud),sizeof(union data)); } 程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的

共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 7.5.2 共用体变量的引用 可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: union data /*共用体* / { int a; float b; double c; char d; } m m ; 其成员引用为:m m . a , m m . b , m m . c , m m . d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 [例7-9] 对共用体变量的使用。 m a i n ( ) { union data { int a; float b; double c; char d; } m m ; m m . a = 6 ; printf("%d\n",mm.a); m m . c = 6 7 . 2 ; p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; m m . d = ' W ' ; m m . b = 3 4 . 2 ; p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; }

C语言结构体和共用体实验报告

实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include typedef struct _PRODUCT int iNumber; char strName[32]; float fPrice; float fDiscount; * 编号 名称 价格 折扣 *1010 键盘 89.50 0.85 *1021 冰箱 1024.00 0.95 *1022 空调 2058.50 0.90 *1023 电视 3001.88 0.95 *************************************************************** */

typedef用法详解

引子: 请讲讲这道题怎么做呢及其相关结构体定义的问题十分感谢 以下结构体类型说明和变量定义中正确的是 A)typedef struct B)struct REC; { int n; char c;}REC; { int n; char c;}; REC t1,t2; REC t1,t2; C)typedef struct REC; D)struct { int n=0; char c='A';}t1,t2; { int n; char c;}REC; REC t1,t2; 可以详细的解释一下这道题吗?其他的错在哪里了呢 十分感谢 我见过这样的题,没看懂你的意思,不过我看这样说吧, struct a {... }B; 我打。。。的地方表示你可以在那里添加所有的数据形式的定义,比如,int a;char a[10];等等; 而B表示变量名。就如同int a的a一样,只是一个变量标示符,他就是一个结构体变量了。当你使用typedef使,它表示的是枚举类型,功能如同宏定义一样, 使用他的时候方法如下: 首先写出你要表示的变量类型。列如:int a;然后在int的前面加上typedef, typedef int a;然后把变量名a 改变成你要使用的表示符如 pp; 现在就变成 typedef int pp; 当你要在定义其他的变量是int型的时候,你就可以这样定义了 pp b; 这里的b就是变量名了。注意枚举类型它并不产生新的变量类型,只是一种替代作用。我在给你举个列子吧typedef struct a{ int s; char p[10]; } num; num n; 这时候n就是 struct a 类型的结构体变量了。不知道你懂没有。。。 C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明: typedef struct tagNode { char *pItem; pNode pNext; } *pNode;

C语言-基础教程-结构体类型变量的定义和引用

C语言-基础教程-结构体类型变量的定义和引用 前面的课程我们学习了一些简单数据类型(整型、实型、字符型)的定义和应用,还学习了数组(一维、二维)的定义和应用,这些数据类型的特点是:当定义某一特定数据类型,就限定该类型变量的存储特性和取值范围。对简单数据类型来说,既可以定义单个的变量,也可以定义数组。而数组的全部元素都具有相同的数据类型,或者说是相同数据类型的一个集合。 在日常生活中,我们常会遇到一些需要填写的登记表,如住宿表、成绩表、通讯地址等。 在这些表中,填写的数据是不能用同一种数据类型描述的,在住宿表中我们通常会登记上姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、邮编、邮箱地址、电话号码、E - m a i l等项目。这些表中集合了各种数据,无法用前面学过的任一种数据类型完全描述,因此C引入一种能集中不同数据类型于一体的数据类型-结构体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。 在上面描述的各种登记表中,让我们仔细观察一下住宿表、成绩表、通讯地址等。 住宿表由下面的项目构成: 这些登记表用C提供的结构体类型描述如下: 住宿表: suct accommod { char name[20]; / *姓名* / char sex; / *性别* / char job[40]; / *职业* / int age; / *年龄* / long number; / *身份证号码* / } ; 成绩表: suct score

{ char grade[20]; / * 班级* / long number; / * 学号* / char name[20]; / *姓名* / float os; / *操作系统* / float datasu; / * 数据结构* / float compnet; / * 计算机网络* / } ; 通讯地址表: suct addr { char name[20]; char department[30];/ * 部门* / char address[30]; / *住址* / long box; / * 邮编* / long phone; / * 电话号码* / char email[30]; / * E m a i l * / };

C语言typedef用法总结

C语言typedef用法总结 黄海涛,2012-3-11 C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。当你一层层剥开它的时候,神秘的面纱终会摘下…… 让我们一起来探究其中的秘密吧! 一、概述 1、类型定义符typedef C语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。 定义形式: typedef 原类型名新类型名; 它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。 2、实质 其实质是:为现有类型取个新名字,它并没有引入新的类型。 typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。 3、作用时机 在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。typedef是由编译器解释的。 ▲typedef与#define的区别 A.#define后面没有分号,而typedef后面有分号; B.#define不是关键字,而typedef是关键字; C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后; D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如: E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。 4、使用原因 1)表达方式更简洁,简化编程; 2)使程序参数化,提高程序的可移植性; 3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。 5、缺点 允许一些看上去混乱的语法,可以把几个声明放在一个声明中。如:

C语言结构体(struct)常见使用方法

C语言结构体(struct)常见使用方法 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 结构体定义: 第一种:只有结构体定义 [cpp]view plain copy 1.struct stuff{ 2.char job[20]; 3.int age; 4.float height; 5.}; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp]view plain copy 1.//直接带变量名Huqinwei 2.struct stuff{ 3.char job[20]; 4.int age; 5.float height; 6.}Huqinwei; 也许初期看不习惯容易困惑,其实这就相当于: [cpp]view plain copy 1.struct stuff{ 2.char job[20]; 3.int age;

4.float height; 5.}; 6.struct stuff Huqinwei; 第三种:如果该结构体你只用一个变量Huqinwei,而不再需要用 [cpp]view plain copy 1.struct stuff yourname; 去定义第二个变量。 那么,附加变量初始化的结构体定义还可进一步简化出第三种: [cpp]view plain copy 1.struct{ 2.char job[20]; 3.int age; 4.float height; 5.}Huqinwei; 把结构体名称去掉,这样更简洁,不过也不能定义其他同结构体变量了——至少我现在没掌握这种方法。 结构体变量及其内部成员变量的定义及访问: 绕口吧?要分清结构体变量和结构体内部成员变量的概念。 就像刚才的第二种提到的,结构体变量的声明可以用: [cpp]view plain copy 1.struct stuff yourname; 其成员变量的定义可以随声明进行: [cpp]view plain copy 1.struct stuff Huqinwei = {"manager",30,185}; 也可以考虑结构体之间的赋值: [cpp]view plain copy

c语言关键字的用法详解

1. Static用法 1.1 static声明的变量在C语言中有两方面的特征: 1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 1.2 特点 A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度; C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题; D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数) E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static 的局部变量的地址作为返回值,若为auto类型,则返回为错指针。 函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。 扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。 1.3 关键字static的作用是什么? 这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

相关主题