Простая функция подкачки... почему она не обменивается?

Я новичок в 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);
}

Ответ 1

Вам не хватает * в функции свопинга. Попробуйте:

void swap(int* a, int* b)
{
 int temp = *a;
 *a = *b;
 *b = temp;
}

Таким образом, вместо того, чтобы просто менять указатели, вы меняете int, на которые указывают указатели.

Ответ 2

Функция swap() работает после мода - она ​​меняет значения переменных a и b, которые являются локальными для swap(). К сожалению, они отличаются от a и b в main() - поэтому вы фактически не видите никакого эффекта от их замены.

Ответ 3

Когда вы думаете о указателях, вам нужно быть понятным в нескольких абстракциях.

Объект в памяти. Это может быть любого типа (и размера). Например, целочисленный объект будет занимать 4 байта в памяти (на 32-битных машинах). Объект-указатель будет занимать 4 байта в памяти (на 32-битных машинах). Как должно быть очевидно, целочисленный объект содержит целочисленные значения; объект-указатель содержит адреса других объектов.

Язык программирования C позволяет символам (переменным) представлять эти объекты в памяти. Когда вы объявляете,

int i;

символ (переменная) я представляет некоторый целочисленный объект в памяти. Более конкретно, он представляет ценность этого объекта. Вы можете управлять этим значением, используя я в программе.

& я даст вам адрес этого объекта в памяти.

Объект-указатель может содержать адрес другого объекта. Вы объявляете объект-указатель, используя синтаксис,

int * ptr;

Как и другие переменные, переменная-указатель представляет значение объекта, объекта-указателя. Это значение просто является адресом другого объекта. Вы устанавливаете значение объекта-указателя таким образом,

ptr = & i;

Теперь, когда вы говорите ptr в программе, вы ссылаетесь на его значение, которое является адресом i. Но если вы говорите * ptr, вы имеете в виду не значение ptr, а скорее значение объекта, адрес которого находится в ptr i.e. i.

Проблема с вашей функцией свопинга заключается в том, что вы меняете значения указателей, а не значения объектов, для которых эти указатели содержат адреса. Чтобы добраться до значений объектов, вам нужно будет использовать * ptr.

Ответ 4

C - это язык с переходом. Ваша подпрограмма swap не разыгрывает указатели, переданные ей, поэтому с точки зрения main ничего не произошло.

Ответ 5

Указатели передаются по значению. Это означает, что a и b все еще a и b, когда возвращаются из функции;

попробуйте что-то вроде этого

void swap(int* a, int* b)
{
 int temp = *a;
 *a = *b;
 *b = temp;
}

Ответ 6

Правильный способ сделать это:

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

Ответ 7

Он меняет местами. Он заменяет локальные указатели a и b внутри swap. Он меняет их отлично, как и должно быть.

Если вы хотите поменять значения, на которые указывают эти указатели, вы должны повторно реализовать свою функцию swap соответственно, т.е. заставить ее обменивать заостренные значения, а не указатели.

Ответ 8

Ответ zildjohn1 - самый простой и понятный способ сделать это. Однако, если вы настаиваете на замене указателей, вам нужно передать указатель на указатель, потому что сам указатель передается по значению.

Ответ 9

Умм, возможно, используя этот

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

Ответ 10

Без использования третьей переменной (темп)

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
}

Ответ 11

Вам нужно отправить адрес a и b для функции swap, поэтому при вызове функции свопинга вы должны вызывать ass swap (& a, & b) Чтобы вы передали адрес и изменили адрес

Ответ 12

#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b))

Хорошо работает.