无法使用指针对没有临时变量的数组进行排序

pro*_*mer 0 c arrays pointers

该算法交换两个整数的值xy不使用tmp的变量是

x = x + y;
y = x - y;
x = x - y;
Run Code Online (Sandbox Code Playgroud)

我编写了一个代码来通过将数组传递给方法来对数组进行排序.该方法接受指针中的数组*ptr.因此,arr[0], arr[1],...可以使用指针变量as来访问数组的元素*(ptr + 0), *(ptr + 1),....但是,我面临的问题是,当我尝试通过使用指针引用内存位置进行排序时交换数组的值,而不使用临时变量,数组不会按照我期望的方式进行排序.相反,我看到一些随机元素被插入到数组中.

这是我的数组排序代码(选择排序 - 排序算法是正确的):

void sort(int *arr, int n){
    int i,j,m;
    for(i=0; i<n-1; i++){
        m = i;
        for(j=i+1; j<n; j++){
            if(arr[j] < arr[m])
                m = j;
        }
        //swapping arr[i] and arr[m]
        *(arr + i) = *(arr + i) + *(arr + m);
        *(arr + m) = *(arr + i) - *(arr + m);
        *(arr + i) = *(arr + i) - *(arr + m);
    }
    //print the array...
}

void main(){
    int arr[] = {2,4,3,5,8,7};
    sort(arr, 6);
}    
Run Code Online (Sandbox Code Playgroud)

输入:

2 4 3 5 8 7
Run Code Online (Sandbox Code Playgroud)

预期产量:

2 3 4 5 7 8
Run Code Online (Sandbox Code Playgroud)

获得的输出:

0 3 0 0 7 8
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我究竟做错了什么?

das*_*ght 5

在不使用tmp变量的情况下交换两个整数x和y的值的算法是

x = x + y;
y = x - y;
x = x - y;
Run Code Online (Sandbox Code Playgroud)

这种方法的几个问题之一是当xy表达式引用相同的内存位置时它不起作用.这正是在嵌套循环完成后项目在其位置时发生的情况,即何时i相同m.

if (i == m) continue在进入交换之前添加将解决此问题.

演示.