【问题标题】:How to swap values in addresses in C如何在C中交换地址中的值
【发布时间】:2019-01-18 01:15:08
【问题描述】:

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

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

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

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

a[0]=  1, a[1]=563, a[2]=193, a[3]=807, a[4]=584, a[5]=479,

Data is now sorted:
a[0]=  1, a[1]=193, a[2]=193, a[3]=479, a[4]=479, a[5]=479,

第二个数组似乎没有显示它已经排序。问题出现在交换函数中,由于某种原因,最后几个元素具有相同的值并且没有被交换。

【问题讨论】:

  • 您首先将指针分配给 ptr,然后更改地址处的值,首先指向的地址。但是, ptr 也指向该内存。你没有交换任何东西。
  • 您所说的另一个交换将值存储在内存中,第一个指向的内存是临时的,而不是指针
  • 这也可以:*first = *first ^ *second; *第二 = *第一 ^ *第二; *first = *first ^ *second;

标签: c pointers memory-address


【解决方案1】:

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

*second = *ptr;

ptr 指向的内存与first 指向的内存相同,所以这和

*second = *first;

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

【讨论】:

  • 啊我现在明白了,我最初的想法是能够切换值的地址。您将如何编写它以便可以使用地址而不是指针交换值?如果你切换地址也会影响 for 循环,因为它需要首先检查最后一个元素的内存地址
  • 您的swap 函数需要采用int ** 参数而不是int*。而且您必须对指针数组进行排序,而不是对整数数组进行排序。
【解决方案2】:

原因是当您更改*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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2010-10-02
    相关资源
    最近更新 更多