Ответ 1
Вам не хватает *
в функции свопинга. Попробуйте:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Таким образом, вместо того, чтобы просто менять указатели, вы меняете int
, на которые указывают указатели.
Я новичок в C и все еще пытаюсь понять концепцию указателей. Я знаю, как написать функцию подкачки, которая работает... Я больше беспокоюсь о том, почему этого конкретного нет.
void swap(int* a, int* b)
{
int* temp = a;
a = b;
b = temp;
}
int main()
{
int x = 5, y = 10;
int *a = &x, *b = &y;
swap(a, b);
printf("%d %d\n"), *a, *b);
}
Вам не хватает *
в функции свопинга. Попробуйте:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Таким образом, вместо того, чтобы просто менять указатели, вы меняете int
, на которые указывают указатели.
Функция swap()
работает после мода - она меняет значения переменных a
и b
, которые являются локальными для swap()
. К сожалению, они отличаются от a
и b
в main()
- поэтому вы фактически не видите никакого эффекта от их замены.
Когда вы думаете о указателях, вам нужно быть понятным в нескольких абстракциях.
Объект в памяти. Это может быть любого типа (и размера). Например, целочисленный объект будет занимать 4 байта в памяти (на 32-битных машинах). Объект-указатель будет занимать 4 байта в памяти (на 32-битных машинах). Как должно быть очевидно, целочисленный объект содержит целочисленные значения; объект-указатель содержит адреса других объектов.
Язык программирования C позволяет символам (переменным) представлять эти объекты в памяти. Когда вы объявляете,
int i;
символ (переменная) я представляет некоторый целочисленный объект в памяти. Более конкретно, он представляет ценность этого объекта. Вы можете управлять этим значением, используя я в программе.
& я даст вам адрес этого объекта в памяти.
Объект-указатель может содержать адрес другого объекта. Вы объявляете объект-указатель, используя синтаксис,
int * ptr;
Как и другие переменные, переменная-указатель представляет значение объекта, объекта-указателя. Это значение просто является адресом другого объекта. Вы устанавливаете значение объекта-указателя таким образом,
ptr = & i;
Теперь, когда вы говорите ptr в программе, вы ссылаетесь на его значение, которое является адресом i. Но если вы говорите * ptr, вы имеете в виду не значение ptr, а скорее значение объекта, адрес которого находится в ptr i.e. i.
Проблема с вашей функцией свопинга заключается в том, что вы меняете значения указателей, а не значения объектов, для которых эти указатели содержат адреса. Чтобы добраться до значений объектов, вам нужно будет использовать * ptr.
C - это язык с переходом. Ваша подпрограмма swap
не разыгрывает указатели, переданные ей, поэтому с точки зрения main
ничего не произошло.
Указатели передаются по значению. Это означает, что a и b все еще a и b, когда возвращаются из функции;
попробуйте что-то вроде этого
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Правильный способ сделать это:
void swap(int* a, int* b)
{
int temp = *a; // Temp is set to the value stored at a (5)
*a = *b; // value stored at a is changed to the value stored at b (10)
*b = temp; // value stored in address b is changed to 5.
}
Он меняет местами. Он заменяет локальные указатели a
и b
внутри swap
. Он меняет их отлично, как и должно быть.
Если вы хотите поменять значения, на которые указывают эти указатели, вы должны повторно реализовать свою функцию swap
соответственно, т.е. заставить ее обменивать заостренные значения, а не указатели.
Ответ zildjohn1 - самый простой и понятный способ сделать это. Однако, если вы настаиваете на замене указателей, вам нужно передать указатель на указатель, потому что сам указатель передается по значению.
Умм, возможно, используя этот
void swap(int** a, int** b)
{
int** temp = a;
a = b;
b = temp;
}
int main()
{
int x = 5, y = 10;
int *a = &x, *b = &y;
swap(&a, &b);
printf("%d %d\n"), *a, *b);
}
Без использования третьей переменной (темп)
void swap(int* a,int* b)
{
// a = 10, b = 5;
*a = *a + *b; // a now becomes 15
*b = *a - *b; // b becomes 10
*a = *a - *b; // a becomes 5
}
Вам нужно отправить адрес a и b для функции swap, поэтому при вызове функции свопинга вы должны вызывать ass swap (& a, & b) Чтобы вы передали адрес и изменили адрес
#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b))
Хорошо работает.