2014-01-24 7 views
-3
#include <stdio.h> 
#include <string.h> 

void swap(int *p1, int *p2) 
{ 
    int *temp; 
temp=p1; 
p1=p2; 
p2=temp; 
} 

main() 
{ 
int n1=10,n2=20; 
printf("%d,%d\n",n1++,++n2); 
swap(&n1,&n2); 
printf("%d,%d",++n1,n2++); 
} 

Когда я запускаю этот код, вы получаете 10,21 и 12,21. Мой вопрос в том, почему значения N1 и N2 не меняются местами? Поскольку функция swap использует указатели, а метод вызывается по ссылке, они не должны меняться? Или я пропустил какую-то концепцию? Заранее спасибоПочему значения не меняются

+4

Если вы хотите реализовать ссылочную семантику, вам нужно * разыменовать * в какой-то момент вашего собеседника. –

ответ

4

Вы поменялись местами указатели, а чем значения. Помните, что C исключительно использует pass-by-value, и поэтому эти указатели передаются по значению. Чтобы поменять местами, на которые они ссылаются, вам нужно снять ссылку с указателей.

void swap(int *p1, int *p2) 
{ 
    int temp; 
    temp=*p1; 
    *p1=*p2; 
    *p2=temp; 
} 

Один из способов вещи о том, что вам необходимо назначить значение типа int. Но ваш код присваивает значения типа int*. И так чисто на том анализе, который основан только на типах, вы можете отклонить свой код.

3
void swap(int *p1, int *p2) 
{ 
    int temp; 
    temp=*p1; 
    *p1=*p2; 
    *p2=temp; 
} 
+1

Пожалуйста, избегайте давать ответы только на код. – user694733

0

изменить вашу функцию подкачки, как следовать

void swap(int *p1, int *p2) 

    { 
     int temp; 
    temp=*p1; 
    *p1=*p2; 
    *p2=temp; 
    } 

Примечание: вы пытаетесь сделать задание по адресам переменных в вашей swap функции

0

Указатели, которые вы меняете в своей swap() Функция - это локальные переменные этой функции. Таким образом, эта замена не влияет на эту функцию.

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

Вы также можете иметь взглянуть на этот вопрос: What is the fastest way to swap values in C?

Ответ делает использование алгоритма XOR подкачка.

+0

XOR swapping работает медленно –

Смежные вопросы