提问人:Alane 提问时间:5/27/2022 最后编辑:Remy LebeauAlane 更新时间:5/27/2022 访问量:286
我在理解双指针 [duplicate] 时遇到问题
I'm having a problem understanding double pointers [duplicate]
问:
我正在制作一个程序,将项目添加到后进先出(后进先出)数组中,其中元素插入到数组的开头。
这是我的代码:
typedef struct neud{
int num;
struct neud *next;
}neud;
void add(neud** head,int val){
//creat a new neod
neud* newNeod;
newNeod = malloc(sizeof(neud));
//assigning
newNeod->num = val;
newNeod->next= *head;
//change the head;
*head = newNeod;
}
int main()
{
neud* head = NULL;
add(&head,10);
add(&head,20);
add(&head,30);
return 0;
}
一切正常,但我不明白这里需要双指针。有人可以解释一下吗?
答:
0赞
Some programmer dude
5/27/2022
#1
在 C 中,函数的所有参数都是按值传递的。这意味着调用中使用的值将复制到函数局部参数变量中。
因此,参数变量的行为与任何其他局部变量一样,其生命周期以函数的结束而结束。当函数返回时,您对变量所做的所有更改都将丢失。
现在想想指针。如果不将指针传递给指针,而只需分配给:head
head
void add(neud* head,int val){
// ...
head = newNeod;
}
现在,该任务将丢失。
当您将指针传递给指针时,将模拟引用调用。该函数现在具有指向原始指针的指针。您可以取消引用双精度指针以获取函数中的原始变量。head
head
main
0赞
Vlad from Moscow
5/27/2022
#2
考虑这个简单的程序。
#include <stdio.h>
void f( int x )
{
x = 10;
}
int main( void )
{
int x = 0;
f( x );
printf( "x = %d\n", x );
}
程序输出为
x = 0
也就是说,函数 f 处理传递给函数的变量 x 值的副本。因此,更改函数中的副本相对于原始变量 x 没有影响。
要更改函数中的原始变量 x,您需要通过引用传递它。在 C 语言中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,在函数中取消引用指针,您可以直接访问指针指向的对象并可以更改它。
将下面的程序与上面的程序进行比较
#include <stdio.h>
void f( int *px )
{
*px = 10;
}
int main( void )
{
int x = 0;
f( &x );
printf( "x = %d\n", x );
}
程序输出为
x = 10
因此,如果您将函数声明为
void add(neud * head,int val);
并称它为
add( head, 10 );
然后,该函数将处理原始指针头值的副本。指针本身的值将保持不变。因此,您需要通过引用传递指针,即函数应该像这样声明
void add(neud** head,int val);
并称
add( &head, 10 );
上一个:内存分配函数返回的点
评论