【发布时间】:2021-05-24 02:45:14
【问题描述】:
我了解指针的概念,并且我们在函数中使用它们来优化我们使用的空间。
我不明白的是在函数中使用它们时的语法。
示例 1:
void fun(int * a)//that means we declared a pointer to an integer type a
{
*a+=1;
}
fun(&b);//calling the function for int b=10;
示例 2:
void fun(int * a)//that means we declared a pointer to an integer type a
{
a+=1;
}
fun(&b);//calling the function for int b=10;
问题:哪一个是正确的,如果他们都是正确的,那么两者之间有什么区别?
在 AKX 回答后编辑: 那么为什么我们在链表中这样做呢?如果我们想改变对象的值而不是指针的地址(在这种情况下是双指针),不应该是**head而不是*head吗??
void push(struct node **head, int data)
{
struct node* newnode = malloc(sizeof(struct node));
newnode->data = data;
newnode->next = *head;
}
push(&head,1);
【问题讨论】:
-
链表代码是您的第一种情况,只是您访问的值是
struct node *,而不是int。 (不过,代码看起来有点可疑:如果只从*head读取,则不需要指向指针的指针。对于具有给定签名的函数,更常见的是改用*head = newnode(或之前)返回节点。) -
@m oehm 所以说 node * newnode=* head 和说 node **head 一样??
-
嗯?不,我是说你的
push函数并没有真正利用你可以从调用函数修改头指针的事实。基本上有两种实现推送值的方法:head = push(head, x)和push(&head, x),其中head是struct node *,&head是struct head **。您的函数看起来像是介于两者之间的混合体。 -
“哪一个是对的,如果他们都是对的,这两者有什么区别?” - 你试过他们看看有什么不同吗?
标签: c pointers linked-list double-pointer