【发布时间】: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.