Что происходит, когда я изменяю функцию подкачки таким образом? - PullRequest
4 голосов
/ 06 апреля 2020

что происходит, когда мы модифицируем функцию подкачки таким образом? Я знаю, что это не работает, но что именно происходит? Я не понимаю, что я на самом деле сделал?

#include <stdio.h>

void swap(int*, int*);

int main(){
   int x=5,y=10;
   swap(&x, &y);
   printf("x:%d,y:%d\n",x,y);
   return 0;
 }

void swap(int *x, int *y){ 
   int* temp;
   temp=x;
   x=y;
   y=temp;
}

Ответы [ 3 ]

8 голосов
/ 06 апреля 2020

В функции

void swap(int* x, int* y){ 
    int* temp;
    temp=x;
    x=y;
    y=temp;
}

вы просто меняете значения указателей для двух аргументов функции.

Если вы хотите поменять их значения, вам нужно реализовать их как

void swap(int* x, int* y){ 
    int temp = *x;  // retrive the value that x poitns to
    *x = *y;        // write the value y points to, to the memory location x points to
    *y = temp;      // write the value of tmp, to the memory location x points to
}

таким образом, функция подкачки меняет значение для указанных областей памяти.

5 голосов
/ 06 апреля 2020
void swap(int *x, int *y){ 
   int* temp;
   temp = x;
   x = y;
   y = temp;
}

swap() принимает здесь два указателя на int, но внутренне только меняет значения локальных указателей x и y - адреса объектов, на которые они указывают. - Означает, что в конце swap() перед возвратом x указывает на объект, на который указывает y, и y указывает на объект, на который указывает x.

Существует не влияет на вызывающего в объектах x и y, на которые указывают.


Если вы хотите поменять местами значения объектов, на которые указывают x и y, вам нужно определить swap() следующим образом:

void swap(int *x, int *y){ 
   int temp;
   temp = *x;     // temp gets the int value of the int object x is pointing to.
   *x = *y;       // x gets the int value of the int object y is pointing to.
   *y = temp;     // y gets the int value of temp (formerly x).
}

Пример Программа ( Онлайн Пример ):

#include <stdio.h> 

void swap(int *x, int *y){ 
   int temp;
   temp = *x;     // temp gets the int value of the int object x is pointing to.
   *x = *y;       // x gets the int value y of the int object y is pointing to.
   *y = temp;     // y gets the int value of temp (formerly x).
}

int main (void)
{
    int a = 1, b = 2;
    printf("Before the swap() function:\n");
    printf("a = %d b = %d\n\n",a,b);

    swap(&a,&b);

    printf("After the swap() function:\n");
    printf("a = %d b = %d",a,b);

    return 0;
}

Вывод:

Before the swap() function:
a = 1 b = 2

After the swap() function:
a = 2 b = 1
4 голосов
/ 06 апреля 2020

Внутри функции ее два параметра, которые содержат копии значений переданных аргументов, меняются местами.

Поскольку функция имеет дело с копиями аргументов, исходные аргументы (переданные указатели на x и y), которые являются временными объектами не будет поменяться местами.

Чтобы поменять значения указателей на x и y, вы должны определить в основном такие указатели, инициализируя их по адресам x и y, и передавать их функции по ссылке через указатели на указатели.

Вот демонстрационная программа.

#include <stdio.h>

void swap( int **ppx, int **ppy )
{
    int *tmp = *ppx;
    *ppx = *ppy;
    *ppy = tmp;
}

int main(void) 
{
    int x=5, y=10;

    int *px = &x;
    int *py = &y;

    printf( "*px = %d, *py = %d\n", *px, *py );

    swap( &px, &py );

    printf( "*px = %d, *py = %d\n", *px, *py );

    return 0;
}

Ее вывод

*px = 5, *py = 10
*px = 10, *py = 5

См. Также мой ответ на этот вопрос Путаница с указателем: метод обмена в c

...