使用指针的反向数组元素的意外输出

时间:2018-12-05 06:22:07

标签: c arrays pointers

我想使用指针反转数组元素 为什么我的输出为4 3 3 4 当我输入1 2 3 4

这里是我的代码

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
    int n, a[100], *ptr;
    printf("enter array size: ");   
    scanf("%d",&n);
    printf("enter array element: ");
    for(int i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }

    ptr = &a[0];
    int j=0;
    int i = n-1;

    while(j != n)
    {   
        a[j] = *(ptr+i);
        j++;
        i--;
    }

    // for printing output

    printf("\nin reverse: \n");
    for(int k=0; k<n; k++)
    {
        printf("%d, ",a[k]);
    }

    return 0;
}

有人可以告诉我这里是什么问题吗?

2 个答案:

答案 0 :(得分:2)

while(j != n)
{   
    a[j] = *(ptr+i);
    j++;
    i--;
}

这实际上不是交换两个值。设置上半部分很简单。为了交换它们,您需要添加以下行:

while(j != n / 2)
{   
    int temp = a[j];
    a[j] = *(ptr+i);
    *(ptr + i) = temp;
    j++;
    i--;
}

答案 1 :(得分:-1)

在您的代码中,您正在覆盖这些值。

为了通过使用指针来反转数字,请在代码中按如下所示替换while-loop

int* ptr_start = a;
int* ptr_end = a + (sizeof(a) / sizeof(a[0])) - 1;
 while (ptr_start < ptr_end) {
        *ptr_end   ^= *ptr_start;
        *ptr_start ^= *ptr_end ;
        *ptr_end   ^= *ptr_start;
        ptr_start++;
        ptr_end--;
      }

注意:对性能会有-ve的影响。