Maddy
Maddy

Reputation: 533

usage of double pointers as arguments

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 using a double pointer as an argument in my_Func function and also making a change of value, both reflect the same in the main function? If we use a single pointer in My_Func, why does that not change the value in main? Please explain this for me with examples if possible.

Upvotes: 6

Views: 27238

Answers (4)

praks411
praks411

Reputation: 1992

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;
}

Upvotes: 0

user8295243
user8295243

Reputation: 3

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.

Upvotes: 0

Garee
Garee

Reputation: 1284

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;
}

Upvotes: 8

Joachim Isaksson
Joachim Isaksson

Reputation: 180887

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.

Upvotes: 7

Related Questions