Путать с указателями C - PullRequest
       14

Путать с указателями C

0 голосов
/ 27 декабря 2018
 #include<stdio.h>

// Function to swap two values but does not work
void swapDoesNotWork (int *ptrX, int *ptrY);

// Function to swap two values and works fine
void swap (int *ptrX, int *ptrY);

void swap (int *px, int *py) {
 int temp;
 temp = *px;
 *px = *py;
 *py = temp;
}

void swapDoesNotWork (int *px, int *py) {
 printf("\n\n");
 int temp;
 temp = *px;
 px = py; 
 py = &temp;
}

int main() {
 int x = 5;
 int y = 10; 
 swapDoesNotWork(&x, &y);
 printf("++++++++++++++++++\n");
 printf("pre x:%d\n", x); 
 printf("pre y:%d\n", y); 
 printf("\n");
 printf("After calling swapDoesNotWork(&x, &y)...\n");
 printf("post x:%d\n", x); 
 printf("post y:%d\n", y); 
 printf("++++++++++++++++++\n\n");
 x = 5;
 y = 10; 
 printf("= = = = = = = = =\n\n");
 printf("pre x:%d\n", x); 
 printf("pre y:%d\n", y); 
 swap(&x, &y);

 printf("\n");
 printf("After calling swap(&x, &y)...\n");
 printf("post x:%d\n", x); 
 printf("post y:%d\n", y); 
 printf("= = = = = = = = =\n\n");
 return 0;

Вывод вышеуказанной программы при компиляции и выполнении:

infi@linux% ./swap_test.o 


++++++++++++++++++
pre x:5
pre y:10

After calling swapDoesNotWork(&x, &y)...
post x:5
post y:10
++++++++++++++++++

= = = = = = = = =
= = = = = = = = =    
pre x:5
pre y:10

After calling swap(&x, &y)...
post x:10
post y:5

Как видно, функция swapDoesNotWork, похоже, не меняет значения, как в случае сswap function.

Я новичок в языке C, в основном из сценариев.Может кто-нибудь помочь мне, почему swapDoesNotWork functon не меняет значения?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

С тем, что вы делаете, вы просто отменили весь смысл использования указателей.

То, что вы делаете, в основном такое же:

temp = a;
a = b;
b = temp;

, что означает, что вы действуете с копией исходных переменных.Итак, что вы делаете, хотя это изменяет значения указателей (если вы попробуете printf внутри функции, результаты должны быть правильными) после того, как функция завершена, результаты исчезнут.Чтобы эта функция работала, вы должны передать в качестве аргумента двойной указатель.Надеюсь, я помог

0 голосов
/ 27 декабря 2018

Вот все изменения, выполненные swapDoesNotWork:

 temp = ...
 px = ... 
 py = ...

Все это присваивания локальным переменным.Локальные переменные уничтожаются при возврате функции, поэтому swapDoesNotWork не имеет длительных эффектов.Он только изменяет переменные, которые в любом случае могут прекратить существование.

С другой стороны, swap содержит следующие строки:

 *px = ...
 *py = ...

Это присвоения местоположениям, на которые указывает pxи py соответственно.Даже если px и py сами являются локальными переменными, они могут указывать на переменные вне текущей функции (в этом случае функция называется swap(&x, &y), поэтому они указывают на переменные x и yв main).

...