Libx

浅析struct

字数统计: 1,092阅读时长: 4 min
2017/10/17 Share

先留坑,空下来来写

typedef是什么

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

使用struct

结构声明

struct person {
int age;
int height;
};

该声明描述了一个由两个整形所组成的结构,但并未创建实际的数据对象,只是描述了该对象由什么组成(可称之为“模板”,因为他勾勒出该结构是如何存数数据的,突然想起js的构造函数。。)

下面来分析一下细节:
首先:关键字struct,它表明跟在后面的是一个结构,后面是一个可选的标记“S1”,稍后程序中可以使用该标记引用该结构,例如:

struct person me;

这把me声明为一个使用person结构的结构变量

定义结构变量

结构有两层含义:一是结构布局,结构布局告诉编译器如何表示数据,但是并未让编译器为数据分配空间。 之后就是需要创建一个结构变量,即是另外一个含义。
struct person me;中,struct person所起的作用就是相当于一般声明中的int float
可以定义两个struct person类型的变量,甚至是一个指向struct person类型结构的指针。
struct person me, xiaoming ,*xiaohong;

就计算机而言:struct person me是以下声明的简化:

struct person {
int age;
int height;
} me;

小结

以上,可知,声明结构的过程和定义结构变量的过程可以组合长一个步骤

struct {
int age;
int height;
} me;

然而,如果需要多次使用,就必须使用带标记的形式,或者使用接下来要介绍的typedef

ps:这只是定义结构变量,并未初始化结构变量

使用typedef

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来定义变量

小结

struct _x1 { ...}x1;
typedef struct _x2{ ...} x2;
```
有什么不同?
其实, 前者是定义了类`_x1`和`_x1`的对象实例`x1`, 后者是定义了类`_x2`和`_x2`的类别名`x2`
所以它们在使用过程中是有区别的
实例:
```C++
typedef struct
{
int num;
int age;
}aaa,bbb,ccc;

这算什么呢?
这相当于

typedef struct
{
int num;
int age;
}aaa;
typedef aaa bbb;
typedef aaa ccc;

也就是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果无typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。

总结

(这个问答是在CSDN看到的,链接在此因为对C和C++学习的并不深入,所以直接拿来了~)
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语言的糟粕。

CATALOG
  1. 1. typedef是什么
  2. 2. 使用struct
    1. 2.1. 结构声明
    2. 2.2. 定义结构变量
    3. 2.3. 小结
  3. 3. 使用typedef
    1. 3.1. typedef与结构结合使用
    2. 3.2. 小结
  4. 4. 总结