技术问询:函数调用中struct Node*与Node*的区别及function1/function2传参差异
嘿,这个问题问到点子上了——这其实是C和C++对结构体类型声明规则的一个典型差异点,咱们掰开揉碎了说:
关于
struct Node* 和 Node* 的区别 核心差异得看你是用C语言还是C++语言写代码:
- 在C语言里:
struct Node才是完整的类型标识,Node本身并不是一个独立的类型。如果没提前用typedef给这个结构体定义别名,直接写Node*编译器会一脸懵——它根本不知道Node是什么。必须带上struct关键字,写成struct Node*,编译器才能识别这是指向Node结构体的指针类型。 - 在C++语言里:C++做了简化,当你定义
struct Node之后,Node会自动成为该结构体类型的别名,所以struct Node*和Node*完全等价,只是写法不同,本质上是同一个类型。
代码中
function1 和 function2 的参数差异 咱们拿你给出的代码片段来分析:
struct Node { int data; struct Node *next; }; void function1(struct Node *start) { // ... } void function2(Node *start) { // ... }
还是分两种编译环境看:
- C语言环境下:
function1的参数struct Node* start是完全合法的,编译器能正确识别这个类型。function2的参数Node* start会直接报错,因为C语言里Node不是一个已定义的类型,必须加上struct关键字才能正常编译。
- C++语言环境下:
- 两个函数的参数类型没有任何差异,
struct Node*和Node*在编译器眼里是同一个东西。不管你给哪个函数传参,要求都是一样的——只要是指向Node结构体的指针就行。
- 两个函数的参数类型没有任何差异,
额外提个小技巧:如果在C语言里想省事儿用Node*这种写法,可以提前用typedef给结构体起别名,比如:
typedef struct Node { int data; struct Node *next; } Node;
这么写之后,Node*和struct Node*就完全等价了,两种写法随便用都没问题。
内容的提问来源于stack exchange,提问作者the_it_crowd
相关产品推荐
相关产品推荐

