C语言 为什么我们需要在链表函数的名字前加一个* ?



为什么需要*(在insertAtfirst前面)?我知道我们用它来创建指针和解引用,但我无法理解这里的逻辑。

struct Node *insertAtFirst(struct Node *head, int data)
{ 
struct Node *ptr = (struct Node *)malloc(sizeof(struct Node));
ptr->next = head;
ptr->data = data;
return ptr;
};

尽管这段特殊的代码可以在c++中编译,但它显然只适合于C编程。

星号是返回类型的一部分,而不是函数名。

  • struct Node *读作指向Node的指针
  • struct Node * f(...)读取为"f是一个返回指向Node">
  • 的指针的函数。

也许使用typedef会使它更清晰?

typedef struct Node * NodePtr; // NodePtr becomes an alias to "struct Node *"
struct Node {
NodePtr next;
int     data;
};
NodePtr insertAtFirst(NodePtr head, int data)
{
NodePtr ptr = (NodePtr)malloc(sizeof(struct Node));
ptr->next = head;
ptr->data = data;
return ptr;
}

我只能建议你熟悉typedef,这是一个伟大的方式,使C/c++代码更具可读性和安全性,特别是当处理这些讨厌的数组和指针。

大多数语言都会(明智地)在适当管理的引用中对程序员隐藏指针。C/c++是允许程序员处理原始内存的古老语言,这是一件非常危险的事情,你很快就会发现。

在c++中使用这样的代码在技术上是可能的,但这将是一个糟糕的想法。c++提供了更安全的方式来处理链表。
唉,C没有。所以,如果你真的在学习C语言,就像你的例子所暗示的那样,你别无选择,只能学习如何处理指针。祝你好运:)

*是insertAtFirst函数返回类型的一部分。它告诉编译器该函数的结果应该是什么。它与函数名本身无关。因此,代码告诉编译器insertAtFirst将返回指向Node (Node*)的指针。在函数内部,ptr被声明为Node*。最后函数返回ptr。

因为函数返回一个struct Node指针(struct Node*)。

指针符号的位置有时令人困惑,因此我建议将其直接放在类型名称之后。例:char*

相关内容

  • 没有找到相关文章

最新更新