【问题标题】:Reversing an array using pointers使用指针反转数组
【发布时间】:2017-02-08 06:40:41
【问题描述】:

我有一个创建和填充数组的程序。然后它被发送到一个名为 reverse 的函数,该函数反转数组中的顺序。编译器不断报错。我不太清楚为什么。

代码

void reverse(int* array, int size) {

    for (int i = 0; i < size/2; i++) {
        int temp = array[i];
        array[i] = array[size-i];
        array[size-i] = temp;
    } // end of for loop

} // end of reverse 


int main( int argc, char** argv ) {

    int array[8];

    // get and print size of the array
    int size = sizeof(array) / sizeof(array[0]);
    printf("Size is %d\n", size);

    // populate array
    for (int i = 0; i < size; i++) {
        array[i] = i;
    } // end of for loop

    // display array before reversing
    for (int i = 0; i < size; i++) {
        printf("%d ", array[i]);
    } // end of for loop

    // new line
    printf("\n");

    // reverse the array
    reverse(&array, size);

    // display the array again after reversing
    for (int i = 0;i < size; i++) {
        printf("%d ", array[i]);

    } // end of for loop
} // end of main

它一直给我这个错误

main.cc:17:14: error: indirection requires pointer operand ('int' invalid)
                int temp = *array[i];
                           ^~~~~~~~~
main.cc:18:3: error: indirection requires pointer operand ('int' invalid)
                *array[i] = *array[size-i];
                ^~~~~~~~~
main.cc:18:15: error: indirection requires pointer operand ('int' invalid)
                *array[i] = *array[size-i];
                            ^~~~~~~~~~~~~~
main.cc:19:3: error: indirection requires pointer operand ('int' invalid)
                *array[size-i] = temp;
                ^~~~~~~~~~~~~~
4 errors generated.
make: *** [main.o] Error 1

【问题讨论】:

  • 当我将它发送到反向时,我删除了数组变量前面的 &。虽然它给了我我认为的地址位置。下面是输出。这是为什么?我的代码中没有打印语句故意打印任何地址。输出:0 1 2 3 4 5 6 7 1412676568 7 6 5 4 3 2 1 [0.5s完成]
  • 您的反向函数有一个错误。想想当 i == 0 时会发生什么。
  • 你的代码是int temp = array[i];,错误是int temp = *array[i];。发布的代码是正确的。请确保您发布的代码会产生您将来询问的错误。
  • @ConradoSanchez:这是一个不同的问题。您需要单独询问。 (但人们已经告诉过你两次,这是一个错误的错误)。

标签: c++ arrays pointers


【解决方案1】:

我确实解决了这个问题有点不同,也许你会使用这个代码:

#include <iostream>

void displayArray(int table[], int size);

void rev(int table[], int size);

void fillTheArray(int table[], int size);

int main(int argc, char** argv) {

    int myArray[8];
    int size = sizeof(myArray) / sizeof(myArray[0]);
    std::cout << "Array size is: " << size << std::endl;

    fillTheArray(myArray, size);
    displayArray(myArray, size);
    std::cout << std::endl;

    rev(myArray, size);
    displayArray(myArray, size);

    std::cin.get();
    return 0;
}

void fillTheArray(int table[], int size) {
    for (int i = 0; i < size; i++) {
        table[i] = i;
    }
}

void displayArray(int table[], int size) {
    for (int i = 0; i < size; i++) {
        std::cout << table[i] << " ";
    }
    std::cout << std::endl;
}

void rev(int table[], int size) {

    int *start = table;
    int *end = table + (size - 1);

    for (int i = 0; i < size; i++) {

        if (start < end) {
            int temp = *end;
            *end = *start;
            *start = temp;
        }

        start++;
        end--;
    }
}

【讨论】:

    【解决方案2】:

    我可以在这段代码中看到两个错误。首先是:将参数传递给函数的错误方式:

     // reverse the array
     reverse(&array, size);
    

    你应该这样做(数组名是指向该数组第一个元素的指针):

    reverse(array, size);
    

    第二个问题是逆向器 - 您尝试访问一些超出 arrar 范围的随机内存:

    array[i] = array[size-i]; 
    

    请记住,在 C++ 中,数组索引的开头是 0 而不是 1。因此,如果您的数组大小为 8,则该数组的最大 insext 为 7(0、1、2、3、4、5、6、7)。您的代码应如下所示:

    array[i] = array[size -i -1];
    

    它应该可以按您的预期工作。

    这是我的指针解决方案:

    void reverse(int arr[], int count)
    {
        int* head = arr;
        int* tail = arr + count - 1;
        for (int i = 0; i < count/2; ++i)
        {
            if (head < tail)
            {
                int tmp = *tail;
                *tail = *head;
                *head = tmp;
    
                head++; tail--;
            }
        }
    
        for (int i = 0; i < count; ++i)
        {
            std::cout << arr[i] << " ";
        }
    }
    

    或者只使用 C++ 中构建的函数:'algorithm' 库中的 std::reverse。

    stackoverflow 上有很多这样的例子: Reverse Contents in Array

    【讨论】:

      【解决方案3】:

      您已经修复了代码中的大部分编译器错误,除了一个错误。

      线

      reverse(&array, size);
      

      应该是

      reverse(array, size);
      

      修复之后,你必须修复reverse中的逻辑错误。

      您使用了错误的索引来访问数组的上半部分。

      void reverse(int* array, int size) {
      
          for (int i = 0; i < size/2; i++) {
              int temp = array[i];
              array[i] = array[size-i];  // When i is 0, you are accessing array[size]
                                         // That is incorrect.
              array[size-i] = temp;
          } // end of for loop
      
      } // end
      

      你需要使用

      void reverse(int* array, int size) {
          for (int i = 0; i < size/2; i++) {
              int temp = array[i];
              array[i] = array[size-i-1];
              array[size-i-1] = temp;
          }
      }
      

      处理算法的另一种方法是使用两个索引。

      void reverse(int* array, int size) {
          for (int i = 0, j = size-1; i < j; ++i, --j) {
              int temp = array[i];
              array[i] = array[j];
              array[j] = temp;
          }
      }
      

      工作程序:http://ideone.com/ReVnGR.

      【讨论】:

      • 这也不是 OP 的问题。这应该是一条评论。
      • @MartinBonner,我注意到 OP 已更新代码以删除所有其他错误。感谢您指出。
      【解决方案4】:

      您将 **int 而不是 *int 传递给 reverse 方法:

      reverse(&array, size);
      

      这样传递:

      reverse(array, size);
      

      【讨论】:

      • 这不是 OP 的问题。问题是发布的代码没有他抱怨的错误。
      • @MartinBonner 你对所有这些答案都投反对票吗?
      • 我对不回答 OP 提出的问题的答案投了反对票。 (在 确实 回答 OP 问题的答案中添加额外的 cmets 很好,所以解释为什么 OP 提出了错误的问题,并回答他们 应该 提出的问题- 但只是指出其他问题应该只是评论)
      猜你喜欢
      • 2017-11-07
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2012-05-05
      相关资源
      最近更新 更多