欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

typedef struct LNode *list和struct LNode有什么区别?

程序员文章站 2022-07-14 19:49:49
...

  typedef struct LNode *list表示定义了一个别名list,list代表 struct LNode *类型的别名,它是一个指针类型。list a,就代表定义了一个struct LNode *类型的变量a。

  而struct LNode代表一个结构体类型。struct LNode a代表定义了struct LNode类型的变量a。

  其详细理解如下所示:

C语言

  在C语言中:

struct StructName

  表示一个完整的类型名。就像int一样。区别是 struct 是自定义类型,而 int 是内置类型。所以声明的时候写法也是类似的:

int n;
struct StructName dummy; // 类型名  对象名

  但是C语言同样提供一个typedef关键字,可以给已有类型(包括内置和自定义类型)定义别名:

typedef int INT;
typedef struct StructName STRUCTNAME;

  注意看上面的结构,其实和声明变量一样的,只是在前面加一个typedef

  1. 如果没有typedefINT 就是一个int类型变量,STRUCTNAMEstruct StructName 类型变量。

  2. 加了 typedef 则“变量名”就变身“类型名”,而“类型名”代表的类型正是加typedef之前“变量名”对应的类型。

  根据上述逻辑,也可以定义对应的指针类型:

typedef int *PINT;
typedef struct StructName *PSTRUCTNAME;

  定义了这些别名之后,你就可以这样用:

INT n;
STRUCTNAME dummy;
PINT pn;
PSTRUCTNAME pdummy;

  等价于:

int n;
struct StructName dummy;
int *pn;
struct StructName *pdummy;

C++

  C++ 中引入了类,关键字为 class,它是 struct的增强版本。声明一个类:

class ClassName {
private:
	int n;
public:
	void setValue(int n);
	int getValue();
};

  当声明这个类的对象时,这样书写:

ClassName className;

  而不需要像 struct 一样写成这样:

class ClassName className;

  但是,在 C++ 中,把 class 换成 struct一样可以编译:

struct StructName {
private:
	int n;
public:
	void setValue(int n);
	int getValue();
};

  声明这个struct的对象时,可以这样书写:

StructName structName;

  而不需要像在 C 语言中一样写成这样:

struct StructName structName;

  但是由于 C++ 兼容绝大多数 C 语法特性,因此上面这种写法也是正确的。