usage of double pointers as arguments

2019-02-18 17:41发布

Please find the code snippet as shown below:

#include <stdio.h> 

int My_func(int **); 

int main() 
{ 
     int a =5;
     int *p = &a;
     My_Func(&p);
     printf("The val of *p is %d\n,*p);
}

void My_Func(int **p)
{
     int val = 100;
     int *Ptr = &val;
     *p = Ptr;
}

How does by using a double pointer as a argument in my_Func function and making change of value reflects the same in the main function but if we use a single pointer in My_Func does not change the value in main?Please do explain me with examples if possible

Advanced thanks
Maddy

4条回答
做个烂人
2楼-- · 2019-02-18 18:09

You are assigning the address of local variable, which will soon disappear when My_Func returns. You can use following in your code. However you can do the same thing just by using single pointer, double pointer is not required in this example.

void My_Func(int **p)
{
     int val = 100;
     int *Ptr = &val;
     **p = *Ptr;
}
查看更多
做自己的国王
3楼-- · 2019-02-18 18:11

Use it in the function declaration:

void func(int *p)
{
  int val =100;
  int *temp=&val;
  p=temp;
 }

p starts pointing to another address i.e. address of val. So it will print the value 100.

Important note: Try it in your downloaded compiler (always in case of pointers) not in the online compiler. The online compiler doesn´t keep track of lost addresses in stack.

查看更多
兄弟一词,经得起流年.
4楼-- · 2019-02-18 18:20

int **p is a pointer to a pointer-to-int. My_Func(int **p) works by changing the value of integer that the pointer-to-int points to i.e. int a.

Without changing the implementation, the function will not work with a pointer-to-int parameter int *p as there is a second level of indirection. In addition, you're setting the value to a local variable that is created on the stack. When the function is completed the memory used for the variable will be reclaimed, therefore making the value of a invalid.

void My_Func(int **p)
{
     int val = 100; // Local variable.
     int *Ptr = &val; // This isn't needed.
     *p = Ptr;
} // val dissapears.

Remove the second level of indirection and copy val by value instead of pointing to it:

#include <stdio.h>

void My_Func(int *p) 
{
    int val = 100;
    *p = val;
}

int main(void) 
{
    int a = 5;
    My_Func(&a);
    printf("The val of a is %d\n", a);
    return 0;
}
查看更多
够拽才男人
5楼-- · 2019-02-18 18:23

In short, in C when you pass something as a parameter, a copy will be passed to the function. Changing the copy doesn't affect the original value.

However, if the value is a pointer, what it points to can be changed. In this case, if you want to affect the pointer, you need to pass a pointer to it down to the function.

查看更多
登录 后发表回答