C:使用指针反向数组?

时间:2018-11-21 22:28:10

标签: c arrays pointers reverse

我看不到这段代码在哪里出错:

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]

(实际上,我每次编译和测试函数并给我随机值时,第一个元素总是会改变)

3 个答案:

答案 0 :(得分:4)

问题出在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);

答案 1 :(得分:0)

有两个问题。在for循环中,end应该是end2

for (q = begin; q < end2; q += 1) {
    swap(q, end2); 
    end2 -= 1; }

另一个问题是电话。应该是array_reverse (a, a+9);,因为array索引从0开始。将长度为a+10的{​​{1}}赋予第二个参数array,则将指向无用的指针传递给数组边界之外的对象。

我必须对这个问题表示赞赏,这使我研究了“交换指针地址”和交换“指针指向的数据”之间的根本区别。

还有一点值得注意的是,在C语言中, function arguments are by-value copies 。我们可以这样重写array_reverse,而不会产生任何不利影响。为什么这样做?

void array_reverse(int *begin, int *end)
    for ( ;begin < end; ) swap(begin++, end--)

函数主体接收本地副本的参数进行处理。因此,修改它们的值没有错。 保证,如果不通过某种形式的indirection进行引用传递,则该函数不能在函数外部修改其参数的初始值。掌握这个概念非常简单。

答案 2 :(得分:-4)

有时,完整的rewrite有助于找出原件中的问题。它还减少了抄袭或复制粘贴的欲望。这是使用while编写循环的另一种方法。 (已更正,谢谢)。

void array_reverse(int *first, int *last)
{
    int *f = first;
    int *l = last;
    while (f < l)
    { 
        swap(f, l);
        f++, l--;
    }
}