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 变量名
————————————————————————————————————————结 构 (Structure)
通常一个简单之变量或数组不足以用来储存复杂之记录。C语言中有结构体之架构,允许使用者宣告数据实体将不同形式之元素储存一起。事实上,结构是一种是一种由使用者自订之数据型态。
<1> 在C语言中,结构的宣告方式如下 :
struct 结构名称卷标 { 数据型态 数据变量元素1;
数据型态 数据变量元素2;
‧‧‧‧‧‧‧‧ };
For example struct Personal {char Name;
int Hour;
int Minute;}
<2> 结构被宣告后即可定义任何变量。 由上述宣告的例子来说明 , Personal 为 此结构之名称 ,又称为标签 ( tag ) , 而在{ } ( 括 号 ) 内的叙述则是personal 这个结构的成员 , Name 为 Personal 这个结构的变量名称 。最后在结构宣告结束时须加一 ; (分号) 表示。
<3> 结构的成员其数据型态可以使用 int, float 及 char。也可用数组与指针变量。
<4> 结构的宣告与使用亦分为内,外部 。所谓内部宣告即表示结构的宣告在程序的 { } ( 括 号 ) 内完成 , 反之 , 如果结构的宣告在程序的 { } ( 括号 ) 外完成称外部宣告。
结 构 的 使 用
上例中结构变量taipei 的宣告, 当结构变量 taipei 宣告完成后即表示其成员包含 下列六项 :
taipei.id ( 或 taipei->id )
taipei.name ( 或 taipei->name )
taipei.age ( 或 taipei->age )
taipei.sex ( 或 taipei->sex )
taipei.address ( 或 taipei->address )
taipei.tel ( 或 taipei->tel )
执行结果 :
Please input your id : 007
Please input your name : Mike
Please input your address : Taipei
Please input your telephone number : 12345678
Please input your sex ( M or F ) : M
Please input your age : 29
‧‧‧‧‧‧‧‧‧‧
Your telephone number : 12345678
l l 指针与结构: 链接串行 (Linked List)
链接串行乃是以指针指向相关之结构。
执行结果 :
p.s. (.) 运算子将结构与结构成员连结
(->) 运算子将指针与结构成员连结
l l 联集 (Union)
<1> 联集之形式与结构非常类似。在C语言中, 联集之宣告方式如下 :
union 联集名称卷标 { 数据型态 数据变量元素1;
数据型态 数据变量元素2;
‧‧‧‧‧‧‧‧ };
Example: union unit { char ch; int num; float fl; } object; | object.ch = ‘a’; object.num = 100; object.fl = 3.41; |
<2> 联集与结构之不同处在于联集所占之空间为所有成员中最大对象拥有之空间。也就是说,联集中所有成员,再同一瞬间,仅能有一种型态存在。上例中,联集object不可能拥有字符 ’a’ 与整数100; 它仅占有4 个 Bytes ,因为成员中float型态所占有空间最大。