C:使用指针反转数组?
C : reverse array using pointers?
我看不出这段代码哪里出错了:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void array_reverse(int *begin, int *end)
{
int *end2 = end;
int *q = 0;
for (q = begin; q < end; q += 1)
{
swap(q, end2);
end2 -= 1;
}
}
它应该反转数组:
arr{ 1, 2, 3}
变为:
arr{ 3, 2, 1}
我的输出:
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
变成:
[111009824, 2, 3, 4, 5, 6, 7, 8, 9, 10]
(实际上,每次我编译和测试我的函数时,第一个元素总是会改变,我猜会给我随机值)
问题在于 for 循环
void array_reverse(int *begin, int *end)
{
int *end2 = end;
int *q = 0;
for (q = begin; q < end; q += 1)
{
swap(q, end2);
end2 -= 1;
}
}
你必须把end
改成end2
才能走到中间停下来
您还必须在调用 swap 之前递减 end2,以便指向正确的值
void array_reverse(int *begin, int *end)
{
int *end2 = end;
int *q = 0;
for (q = begin; q < end2; q += 1)
{
end2 -= 1;
swap(q, end2);
}
}
函数调用看起来像这样
int test[10] = {1,2,3,4,5,6,7,8,9,10};
array_reverse(test, test + 10);
这是使用 while
.
编写循环的另一种方法
void array_reverse(int *first, int *last)
{
int *f = first;
int *l = last;
while (f < l)
{
swap(f, l);
f++, l--;
}
}
有两个问题。在 for
循环中,end
应该是 end2
.
for (q = begin; q < end2; q += 1) {
swap(q, end2);
end2 -= 1; }
另一个问题是电话。它应该是 array_reverse (a, a+9);
,因为 array
索引从 0
开始。给第二个参数 a+10
一个长度为 10 的 array
传递一个指向数组边界之外的无意义的指针。
我必须对这个问题表示赞赏,它让我研究了 "swapping pointer addresses around" 和交换“指针指向的数据”之间的根本区别。
另外值得注意的是,在 C 中,function arguments are by-value copies。我们可以像这样重写 array_reverse
而不会产生不良后果。为什么这样做有效?
void array_reverse(int *begin, int *end)
for ( ;begin < end; ) swap(begin++, end--)
函数体接收 本地副本 参数进行处理。因此,修改它们的值并没有错。 保证 函数不能在函数外部修改其参数的初始值,除非通过某种形式的 indirection 模拟引用传递。掌握这个概念非常简单。
我看不出这段代码哪里出错了:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void array_reverse(int *begin, int *end)
{
int *end2 = end;
int *q = 0;
for (q = begin; q < end; q += 1)
{
swap(q, end2);
end2 -= 1;
}
}
它应该反转数组:
arr{ 1, 2, 3}
变为:
arr{ 3, 2, 1}
我的输出:
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
变成:
[111009824, 2, 3, 4, 5, 6, 7, 8, 9, 10]
(实际上,每次我编译和测试我的函数时,第一个元素总是会改变,我猜会给我随机值)
问题在于 for 循环
void array_reverse(int *begin, int *end)
{
int *end2 = end;
int *q = 0;
for (q = begin; q < end; q += 1)
{
swap(q, end2);
end2 -= 1;
}
}
你必须把end
改成end2
才能走到中间停下来
您还必须在调用 swap 之前递减 end2,以便指向正确的值
void array_reverse(int *begin, int *end)
{
int *end2 = end;
int *q = 0;
for (q = begin; q < end2; q += 1)
{
end2 -= 1;
swap(q, end2);
}
}
函数调用看起来像这样
int test[10] = {1,2,3,4,5,6,7,8,9,10};
array_reverse(test, test + 10);
这是使用 while
.
void array_reverse(int *first, int *last)
{
int *f = first;
int *l = last;
while (f < l)
{
swap(f, l);
f++, l--;
}
}
有两个问题。在 for
循环中,end
应该是 end2
.
for (q = begin; q < end2; q += 1) {
swap(q, end2);
end2 -= 1; }
另一个问题是电话。它应该是 array_reverse (a, a+9);
,因为 array
索引从 0
开始。给第二个参数 a+10
一个长度为 10 的 array
传递一个指向数组边界之外的无意义的指针。
我必须对这个问题表示赞赏,它让我研究了 "swapping pointer addresses around" 和交换“指针指向的数据”之间的根本区别。
另外值得注意的是,在 C 中,function arguments are by-value copies。我们可以像这样重写 array_reverse
而不会产生不良后果。为什么这样做有效?
void array_reverse(int *begin, int *end)
for ( ;begin < end; ) swap(begin++, end--)
函数体接收 本地副本 参数进行处理。因此,修改它们的值并没有错。 保证 函数不能在函数外部修改其参数的初始值,除非通过某种形式的 indirection 模拟引用传递。掌握这个概念非常简单。