Вы хотите изменить значения указателей.Указатели передаются по значению, поэтому вам нужен указатель на указатель, чтобы изменить его значение:
#include <stdio.h>
void s(int** foo, int** bar)
{
*foo = *bar;
}
int main(void)
{
int c = 10;
int d = 5;
int *a = &c;
int *b = &d;
printf("%d %d\n", *a, *b); // 10 5
s(&a, &b);
printf("%d %d\n", *a, *b); // 5 5 a points at d as well
}
В вашей версии вы изменили только те параметры, которые являются копиями значений, переданных в функцию.
Чтобы помочь вам лучше понять, рассмотрим следующее:
#include <stdio.h>
void value(int foo, int bar)
{
foo = bar; // changing local copies
}
void pointer(int *foo, int *bar)
{
*foo = *bar; // changing the value foo points to to the value bar points to
}
int main(void)
{
int a = 5;
int b = 7;
value(a, b);
printf("%d, %d\n", a, b); // 5, 7
pointer(&a, &b);
printf("%d, %d\n", a, b); // 7, 7
}
Мы сделали это с типом int
.Теперь давайте просто заменим int
на int*
:
#include <stdio.h>
void value(int *foo, int *bar)
{
foo = bar; // changing local copies
}
void pointer(int **foo, int **bar)
{
*foo = *bar; // changing the value foo points to to the value bar points to
}
int main(void)
{
int x = 5;
int y = 7;
int *a = &x;
int *b = &y;
value(a, b);
printf("%d, %d\n", *a, *b); // 5, 7
pointer(&a, &b);
printf("%d, %d\n", *a, *b); // 7, 7 now both point at y
}
Итак, вы видите, это одна и та же концепция оба раза.В первом примере указанными значениями являются int
с, а их значения являются числами, во втором примере указанными значениями являются int*
с, а их значения являются значениями указателя ( <~ </em> стандартная терминология,"адрес").Но механизм тот же