OriginalGriff
Хотя Патрис Т прав, это возможно, но для этого вы начинаете усложнять свой код.
Поскольку вызов по значению (по умолчанию для C) всегда передает копию параметра, любые изменения, которые вы вносите в эту переменную внутри функции, не отражаются во внешнем мире - что очень хорошо! Изображение, если вы передали все по ссылке:
void Double(int x)
{
x = x * 2;
}
Затем вызвать его:
int val = 666;
Double(val);
printf("%u", val);
Напечатает то, что вы ожидаете: 1332
Но это не единственный способ, которым вы могли бы это назвать:
Double(666);
printf("%u", 666);
Что это должно было напечатать? 1332? 666? Если это первый, то ваш код будет очень запутанным, очень быстрым! И если это второе ... что случилось с вызовом функции?
Таким образом, параметры передаются по значению, а не по ссылке, поэтому единственный способ повлиять на внешний мир-это передать копию адреса значения, а затем функция может изменить его значение.
void Double2(int* x)
{
*x = *x * 2;
}
int val = 666;
Double2(&val);
printf("%u", val);
Напечатает то, что вы ожидаете: 1332
И
Double2(&666);
printf("%u", 666);
Не будет компилироваться, так как вы не можете взять адрес постоянного значения.
Что возвращает нас к вашей проблеме: с помощью pass by value, как вы меняете местами два указателя?
Просто: вы передаете указатель на указатель на символ:
void swap(char **str1, char **str2)
{
char *temp = *str1;
*str1 = *str2;
*str2 = temp;
}
А затем вы передаете адрес указателя:
char *str1 = "geeks";
char *str2 = "forgeeks";
swap(&str1, &str2);
printf("str1 is %s, str2 is %s", str1, str2);
В этом есть смысл?