使用指针反转数组

时间:2017-02-08 06:40:42

标签: c++ arrays pointers

我有这个程序来制作和填充数组。然后将它发送到一个名为reverse的函数,该函数反转数组中的顺序。编译器不断给出错误。我不太清楚为什么。

CODE

let url = NSURL(string: "TestB://com.dali.TestB")!
UIApplication.sharedApplication().openURL(url)

它一直给我这个错误

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

4 个答案:

答案 0 :(得分:0)

我确实解决了这个问题,可能你会使用这段代码:

#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--;
    }
}

答案 1 :(得分:0)

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

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

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

reverse(array, size);

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

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

请记住,在C ++数组索引的开头不是0,而不是1。因此,如果您的数组大小为8,则此数组的最大索引为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

答案 2 :(得分:-1)

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

该行

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

答案 3 :(得分:-2)

你将** int而不是* int传递给反向方法:

reverse(&array, size);

通过它:

reverse(array, size);