Если у вас есть функция, подобная этой
void f( T item );
, где T
- некоторый спецификатор типа и вызывает его как
T object;
f( object );
, тогда функция получает копию своего аргумента. Это можно представить следующим образом
T object;
f( object );
//....
void f( /* T item */ )
{
T item = object;
// ...
}
Таким образом, изменения копии в функции не влияют на исходный объект, переданный функции в качестве аргумента.
Чтобы изменить исходный объект Вы должны передать его по ссылке. Например,
void f( T *item )
{
*item = new_value;
//...
}
//...
T object;
f( &object );
Если у вас есть объект типа int
, который вы хотите изменить в функции, просто замените спецификатор типа T
на тип int
, и вы получите.
void f( int *item )
{
*item = new_value;
//...
}
//...
int object;
f( &object );
Если объект имеет тип int *
, замените T
на int *
, и вы получите
void f( int **item )
{
*item = new_value;
//...
}
//...
int *object;
f( &object );
Вот демонстрационная программа.
#include <stdio.h>
#include <stdlib.h>
void f( int *x )
{
*x = 20;
}
void g( int **p )
{
*p = malloc( sizeof( int ) );
**p = 30;
}
int main(void)
{
int x = 10;
printf( "x = %d\n", x );
f( &x );
printf( "x = %d\n", x );
int *px = &x;
printf( "*px = %d\n", *px );
g( &px );
printf( "*px = %d\n", *px );
free( px );
return 0;
}
Его выход
x = 10
x = 20
*px = 20
*px = 30