C语言中的type struct 和struct区别
typedef struct 和 struct 在 C 和 C++ 中的区别主要体现在命名结构体类型的方式上。为了更好地理解,我们先分别解释这两种用法。
1. struct 的用法
在 C 中,如果只用 struct 定义一个结构体类型,每次使用这个结构体时,都需要带上 struct 关键字。例子如下:
struct Person {
char name[50];
int age;
};
int main() {
struct Person p1;
p1.age = 25;
return 0;
}
在这个例子中,Person 是通过 struct 定义的结构体,但在使用时,仍然需要用 struct Person 来声明变量。这种方式使代码显得有点冗长。
2. typedef struct 的用法
typedef 可以用来为现有的数据类型创建一个新的别名。当与 struct 结合使用时,我们可以省略在使用结构体时的 struct 关键字。例子如下:
typedef struct {
char name[50];
int age;
} Person;
int main() {
Person p1;
p1.age = 25;
return 0;
}
在这个例子中,我们使用 typedef 给结构体创建了一个别名 Person,这样在以后声明变量时,直接使用 Person 而不用再写 struct Person。
这两个 typedef 声明看起来相似,但它们的结构和使用略有不同。下面我来详细解释这两种用法的区别:
第一种:typedef struct { int x; int y; } Point;
typedef struct {
int x;
int y;
} Point;
- 解释:这是一个匿名结构体的定义,且使用
typedef为它定义了别名Point。 - 匿名结构体:因为没有给结构体本身命名(没有写
struct Name),只能通过Point来引用它,无法通过struct关键字来使用。
使用示例:
Point p1; // 正确,直接使用 Point p1.x = 10; p1.y = 20;
在这种情况下,Point 是唯一的引用方式,不能通过 struct 来访问这个结构体。
第二种:typedef struct Point { int x; int y; } Point;
typedef struct Point {
int x;
int y;
} Point;
- 解释:这是一个命名结构体的定义,
Point既是结构体的名字,也是通过typedef定义的别名。 - 命名结构体:除了可以通过
Point来引用该结构体之外,还可以使用struct Point。
使用示例:
Point p1; // 正确,直接使用 typedef 定义的别名 struct Point p2; // 也正确,可以使用 struct Point p1.x = 10; p2.y = 20;
在这种情况下,你既可以用 Point 作为别名,也可以通过 struct Point 来引用这个结构体。
区别总结:
- 第一种方式定义了一个匿名结构体,并通过
typedef给它取了一个名字Point,只能通过Point来访问它。 - 第二种方式定义了一个命名结构体
struct Point,并通过typedef给它一个别名Point,可以通过struct Point或Point来访问。
什么时候使用哪一种?
- 如果你不关心结构体名称,只需要一个简化的别名,第一种方法可以让代码更简洁。
- 如果你希望既能通过
struct关键字访问结构体,又希望使用一个简化的别名,第二种方法更灵活。
algorithm note 文章被收录于专栏
记录在newcoder刷题找工作的点点滴滴
查看3道真题和解析