Простая функция свопинга ... почему этот не поменяется? - PullRequest
11 голосов
/ 01 октября 2010

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

Ответы [ 12 ]

30 голосов
/ 01 октября 2010

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

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

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

12 голосов
/ 01 октября 2010

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

4 голосов
/ 01 октября 2010

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

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

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

int i;

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

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

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

int * ptr;

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

ptr = & i;

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

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

2 голосов
/ 01 октября 2010

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

1 голос
/ 05 декабря 2014

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

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
}
1 голос
/ 01 октября 2010

Умм, может быть, с помощью этого

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 голос
/ 01 октября 2010

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

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

1 голос
/ 01 октября 2010

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

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. 
}
1 голос
/ 01 октября 2010

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

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

void swap(int* a, int* b)
{
 int temp = *a;
 *a = *b;
 *b = temp;
}
0 голосов
/ 22 июня 2017
#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b))

Работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...