如何在C中的地址中交换值

时间:2019-01-18 01:15:09

标签: c pointers memory-address

我正在尝试创建随机数据,并使用bubble sort algorithm将它们按升序排序。首先,我要创建随机数据,然后将它们传递到冒泡函数中,然后该泡沫函数具有交换功能。

import C1 
class C2():
    C2_a = 1
    C2_b = 2
    C1_sample = C1_class.C1()

C2_sample = C2()
print(C2_sample.C1_sample.test_func)

我知道交换功能应改为:

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

#define N 5

void swap(int *first, int *second)
{
    int *ptr;
    ptr = first;
    *first = *second;
    *second = *ptr;
}

void bubble(int A[], int length) {
  int n; /* The number of algorithm passes */
  int a;
  int b;
  int *ptr;
  n = length - 1;
  for (a=0; a<=n; a++) {
    for (b=n; b>a; b--) {
        if(A[b-1]>A[b])
        {
        swap(&A[b-1], &A[b]);
        }
    }
  }
}

void print_int_array(int a[], int length) {
  int i;

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

int main(void) {
  int i;
  int data[N];

  /* Create random data */
  for (i=0; i<N; i++) {
    data[i] = (int) ((rand()+0.5)/(double) RAND_MAX * 999);
  }

  print_int_array(data,N); /* Print original random dataset */

  bubble(data,N);
  printf("Data is now sorted:\n"); /* Print sorted data */

  print_int_array(data,N);

  return 0;
}

但这与我创建的原始交换函数有何不同?

当我用原始代码运行代码时,我得到的结果是:

void swap(int *first,int *second)
{
    int temp = *first;
    *first = *second;
    *second = temp;
}

第二个数组似乎并不表明它已被整理。该问题出现在交换函数中,由于某种原因,最后几个元素具有相同的值并且未被交换。

2 个答案:

答案 0 :(得分:0)

在原始交换函数中,您要覆盖first指向的数据。将指针保存在另一个变量中不会在任何地方保存原始数据。因此,当您这样做

*second = *ptr;

ptr指向first所指向的内存,因此这与

没什么不同
*second = *first;

由于您已从上一行的*second复制到*first,因此只需将其复制回*second。最终结果是两个位置都包含最初包含的*second*

答案 1 :(得分:0)

原因是,当您更改*first时,也会更改*ptr

void swap(int *first, int *second)
{
    int *ptr; // say that *first is 2 and *second is 1
    ptr = first; // ptr points to the same memory as first
    *first = *second; // now *first and *ptr is 1
    *second = *ptr; // *second doesn't change as intended, and is still 1
}