c - void swap(int *a, int *b) 不适用于数组

标签 c arrays pointers swap

C 编程新手,尝试创建一个交换两个变量值的 void 函数。当我希望交换两个整数变量的值时,以下函数可以很好地工作,例如 a = 11, b = 33 并调用函数 swap(&a, &b):

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

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

void swap(int i, int j, int a[]) {
  int h = a[i];
  a[i] = a[j];
  a[j] = h;
}

有谁知道为什么第一个适用于单个变量而不适用于数组元素?当然,我在这里缺少一个很好的解释。欢迎所有帮助,提前致谢!!

这是完整的程序:

#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;
}

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

最佳答案

让我猜一下——所有值都变成零?

如果a == b,你的交换函数就会被破坏。尝试:

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

关于c - void swap(int *a, int *b) 不适用于数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26514886/

相关文章:

c - 从 main 调用后填充字符串数组的函数不包含第 0 个元素

C不会执行

c - 如何将字节数组(包含十六进制值)转换为十进制

javascript - 获取随机范围选择的最大值

php - 从 mysql 获取数组创建命名 session 数组

c++ - 编写深拷贝 - 复制指针值

从头文件调用 Struct 到 main 函数

c - 函数返回但没有执行我的要求

c# - ILGenerator:如何使用非托管指针? (我得到一个 VerificationException)

c - 指针取消引用 balagurusamy