【问题标题】:Exchange sort algorithm in c using pointers使用指针在c中交换排序算法
【发布时间】:2017-06-19 17:21:25
【问题描述】:

我正在尝试使用指针而不是索引在 c 中编写交换排序;

我不明白为什么这段代码不起作用:

void sort(int a[], int n) {
  int *i, *j, *temp;
  int * const end = a + n;

  for(i = a; i < end - 1; i++)
    for(j = i + 1; j < end; j++)
      if(*i > *j) {
        temp = i;
        i = j;
        j = temp;
      }
}

如果我在 main 中编写此代码,则交换可以正常工作:

int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *i = a;
int *j;
int *temp;

i = a;
j = a + 1;
printf("pre-swap - i: %i | j: %i\n", *i, *j);

temp = i;
i = j;
j = temp;
printf("post-swap: i: %i | j: %i\n", *i, *j);

它成功交换了两个值。

但是当我使用这段代码时它对数组没有任何作用:

sort(a, 10);

为什么我的排序算法不起作用?

【问题讨论】:

  • 它不交换值,它交换指针。检查a[0]和a[1],还是和swap前一样。
  • temp = i; i = j; j = temp; -> temp = *i; *i= *j; *j=temp;int temp;
  • 强烈建议使用调试器并逐步执行您的代码。
  • 在您的 in-main 示例中,您说:“它成功交换了两个值。” - 不,您交换 pointer 值(即交换指针变量中保存的地址)。 a[] 中的实际值保持在原来的位置。更改指针所指内容的唯一方法是通过 dereference,您应该熟悉它,因为您使用它来比较和打印值。记住:指针持有地址。您需要取消引用指针以到达该点 to.

标签: c algorithm sorting


【解决方案1】:

这是正确的解决方案:

void sort(int a[], int n) {
int *i, *j, temp;
int * const end = a + n;

    for(i = a; i < end-1; i++) {
        for(j = i + 1; j < end; j++) {
            if(*i > *j) {
                temp = *i;
                *i = *j;
                *j = temp;
            }
        }
    }
}

上面其他人的评论是完全正确的。您必须使用取消引用。阅读有关指针的更多信息并使用调试。如果您不知道,请从打印所有值开始。

【讨论】:

  • 我很高兴我得到了解决方案!我现在更好地理解了指向数组的指针。我必须取消引用(*)一个指针来访问它的值。否则,我正在访问存储在指针中的内存地址。
  • @JonathanDewein 很高兴我们都能够为您提供帮助 :) 我看到了您的个人资料,发现您曾在各种技术和科学领域工作过。你现在正在努力学习 C 和算法,这很好。一切顺利。
猜你喜欢
  • 2014-04-19
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
相关资源
最近更新 更多