【问题标题】:C : reverse array using pointers?C:使用指针的反向数组?
【发布时间】:2018-11-21 22:28:09
【问题描述】:

我没有看到我在这段代码中出错的地方:

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]

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

【问题讨论】:

  • 你得到什么输出?
  • 是的,我知道这一点,但为什么在这里:stackoverflow.com/questions/53420928/c-array-sum-using-pointers 我们做 p ++ 是一样的?
  • 如果你没有停在数组的中间,你将把它反转两次,然后在你开始的地方结束。
  • 请问如何在数组中间停下来
  • pre-decrement end2 因为起初它指向无效数据

标签: c arrays pointers reverse


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有两个问题。在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 会传递一个指向数组边界外无意义的指针。

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

    还有一点值得注意的是,在 C 中,function arguments are by-value copies。我们可以像这样重写array_reverse 而不会产生不良后果。为什么会这样?

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

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

    【讨论】:

      【解决方案3】:

      这是使用while 编写循环的另一种方式。

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

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        • 2017-08-25
        • 2018-01-04
        • 2013-07-08
        相关资源
        最近更新 更多