void swap(int*a,int*b)不使用数组

jak*_*992 3 c arrays swap pointers

C编程的新手,以及尝试创建一个void函数来交换两个变量的值.当我希望交换两个整数变量的值时,以下函数可以正常工作,假设a = 11,b = 33,函数调用swap(&a,&b):

void swap(int *a, int *b) {
  *a += *b;
  *b = *a - *b;
  *a -= *b; 
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用数组的两个元素执行此操作时,它对交换(&a [0],&a [2])无法正常工作.但它确实可以使用以下功能:

void swap(int i, int j, int a[]) {
  int h = a[i];
  a[i] = a[j];
  a[j] = h;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么第一个单变量工作而不是数组元素?当然有一个非常好的解释,我在这里失踪.欢迎所有帮助,谢谢!

这是完整的程序:

#include <stdio.h>
#include <stdlib.h>


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

void selectionSort(int a[], int len) {
  int i, j, min;
  for (i = 0; i < len; i++) {
    min = i;
    for (j = i+1; j < len; j++) {
      if (a[j] < a[min]) {
        min = j;
      }
    }
    swap(&a[i], &a[min]);
  }  
}

int main(int argc, char * argv[]) {
  int a[5] = {5, 4, 3, 2, 1};
  int len = 5, i;

  selectionSort(a, len);


  for (i = 0; i < len; i++) {
    printf("%d ", a[i]);
  }
  printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

数组值的输出为1 2 0 0.

Dav*_*rtz 6

让我猜 - 所有的值都转为零?

如果你的交换功能坏了a == b.尝试:

void swap(int *a, int *b) {
  if (a != b)
  {
      *a += *b;
      *b = *a - *b;
      *a -= *b; 
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @ jake1992:当`*a ==*b`(两个元素相等)时它可以正常工作.你的问题是`a == b`,也就是说,都指向SAME元素. (2认同)