我在理解双指针时遇到问题
I'm having a problem understanding double pointers
我正在编写一个程序,用于将项目添加到 LIFO(后进先出)数组,其中元素插入到数组的开头。
这是我的代码:
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;
}
一切正常,但我不明白这里是否需要双指针。有人可以解释一下吗?
在 C 中,函数的所有参数都按值传递。这意味着调用中使用的值被 copied 到函数 local 参数变量中。
因此,参数变量的行为与任何其他局部变量一样,并且它的 life-time 在函数结束时结束。当函数 returns.
时,您对变量所做的所有更改都将丢失
现在想想head
指针。如果不传指针给指针,直接赋值给head
:
void add(neud* head,int val){
// ...
head = newNeod;
}
现在该分配将丢失。
当您将一个指针传递给一个指针时,您通过 reference 模拟调用。该函数现在有一个指向原始指针的指针。您可以取消引用 double-pointer head
以在 main
函数中获取原始变量 head
。
考虑这个简单的程序。
#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 );
我正在编写一个程序,用于将项目添加到 LIFO(后进先出)数组,其中元素插入到数组的开头。
这是我的代码:
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;
}
一切正常,但我不明白这里是否需要双指针。有人可以解释一下吗?
在 C 中,函数的所有参数都按值传递。这意味着调用中使用的值被 copied 到函数 local 参数变量中。
因此,参数变量的行为与任何其他局部变量一样,并且它的 life-time 在函数结束时结束。当函数 returns.
时,您对变量所做的所有更改都将丢失现在想想head
指针。如果不传指针给指针,直接赋值给head
:
void add(neud* head,int val){
// ...
head = newNeod;
}
现在该分配将丢失。
当您将一个指针传递给一个指针时,您通过 reference 模拟调用。该函数现在有一个指向原始指针的指针。您可以取消引用 double-pointer head
以在 main
函数中获取原始变量 head
。
考虑这个简单的程序。
#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 );