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刷题找工作的点点滴滴