[英]If a parameter is a pointer type, is the parameter a pointer allocated in local memory
我只是学习C,我对指针参数有疑问。 我的代码如下:
int Length(node *head)
{
int length = 0;
while (head) {
length++;
head = head->next;
}
return length;
}
我正在阅读的书中的代码说要做到这一点:
int Length(struct node* head)
{
struct node* current = head;
int count = 0;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
真的有区别吗? 我正在阅读我的代码的方式是我得到一个指向node
结构的指针作为参数。 然而,指针本身是一个局部变量,只要我不首先取消引用它,我就可以自由变异。 因此,我可以将指针的值更改为指向不同的node
(可能是下一个节点)。
这会导致内存泄漏还是还有其他一些我没看到的差异?
此代码用于链接列表实现。 节点结构定义为:
// Define our linked list node type
typedef struct node {
int data;
struct node *next;
} node;
是的,他们都在做同样的事情。 但在第二个例子中,由于代码,作者试图做的更清楚。 在第一个示例中,您使用指针头来引用除头部之外的节点。 这可能令人困惑。
你可以像这样编写你的函数,你的意图是明确的:
int GetLength(node* current)
{
int length = 0;
while (current != NULL)
{
length += 1;
current = current->next;
}
return length;
}
您的解决方案和推理是正确的。 node
参数是一个局部变量:传递给函数的指针的副本,在堆栈上分配。 这就是你可以在函数中修改它的原因。
两种解决方案之间没有区别,至少在功能上没有区别,现代编译器最有可能优化本书解决方案中的额外变量。 唯一的细微差别在于风格,许多人倾向于将参数作为不可修改的值,以防万一,以避免错误。
您对论证传递机制的理解是正确的。 有些人只是不喜欢修改参数值,原因是修改参数往往容易出错。 人们强烈期望在函数的任何一点,如果你想获得调用者作为head
传递的值,你就可以写出head
。 如果修改参数,然后不注意,或者如果你沮丧个月后维护的代码,你可以写head
期待的原始值,并得到一些其他的事情。 无论参数的类型如何,都是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.