[C]只有指针

时间:2017-04-06 07:52:19

标签: c arrays pointers

我试图仅使用指针反转数组。该程序运行没有任何错误,但它不会反转数组。我的代码出了什么问题?

#include <stdio.h>

#define SIZE 10
void arrayReverseOutput(int * arr);
void arrayInput(int * arr);
void printArray(int * arr);

int main(void)
{
    int arr[SIZE] = { 0 };
    arrayInput(arr);
    arrayReverseOutput(arr);
    printArray(arr);

    system("PAUSE");
    return 0;
}

void arrayInput(int * arr){
    int i = 0;
    for (i = 0; i < SIZE; i++){
        scanf("%d",(arr+i));
    }
}

void arrayReverseOutput(int * arr){
    int i = 0;
    int k = SIZE-1;
    int temp = 0;


    for (i = 0; i < SIZE; i++){
        temp = *(arr+i);
        *(arr+i) = *(arr + k);
        *(arr + k) = temp;
        k--;
    }
}

void printArray(int * arr){
    int i = 0;
    for (i = 0; i < SIZE; i++){
        printf("%d ", *(arr+i));
    }
}

2 个答案:

答案 0 :(得分:3)

问题是,你实际上是在反转数组两次,否定了通过交换位置所做的任何改变。

在交换元素时仅循环一半数组,如

 for (i = 0; i < SIZE/2; i++)

答案 1 :(得分:2)

您可以使用2个指针来执行此操作

void arrayReverseOutput(int *head, int *tail)
{
    int temp = 0;

    do
    {
        temp = *tail;
        *tail = *head;
        *head = temp;
    }
    while (head++ < tail--);
}

完整代码

#include <stdio.h>

#define SIZE 10
void arrayReverseOutput(int *head, int *tail);
void arrayInput(int * arr);
void printArray(int * arr);

int main(void)
{
    int arr[SIZE] = { 0 };
    arrayInput(arr);
    arrayReverseOutput(arr, &arr[SIZE - 1]);
    printArray(arr);

    return 0;
}

void arrayInput(int * arr)
{
    int i = 0;
    for (i = 0; i < SIZE; i++)
    {
        scanf("%d", (arr + i));
    }
}

void arrayReverseOutput(int *head, int *tail)
{
    int temp = 0;

    do
    {
        temp = *tail;
        *tail = *head;
        *head = temp;
    }
    while (head++ < tail--);
}

void printArray(int * arr)
{
    int i = 0;
    for (i = 0; i < SIZE; i++)
    {
        printf("%d ", *(arr + i));
    }
}