Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针的反向数组元素的意外输出_C_Arrays_Pointers - Fatal编程技术网

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

C 使用指针的反向数组元素的意外输出,c,arrays,pointers,C,Arrays,Pointers,我想使用指针反转数组元素,但 为什么我会以4-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

我想使用指针反转数组元素,但 为什么我会以4-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;
}
#包括
#包括
int main(int argc,char const*argv[]
{
int n,a[100],*ptr;
printf(“输入数组大小:”);
scanf(“%d”和“&n”);
printf(“输入数组元素:”);
对于(int i=0;i
这实际上并不是交换这两个值。只需设置前半部分即可。为了交换它们,您需要添加一行,如下所示:

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

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

若要使用指针反转原位数字,请在代码中按如下所示替换
while循环

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--;
      }
int*ptr\u start=a;
int*ptr_end=a+(sizeof(a)/sizeof(a[0])-1;
同时(ptr_开始

注意:这将对性能产生-ve影响。

你能告诉我为什么你认为代码应该反转数组吗?只需拿一张纸和一支铅笔,用手按照算法操作。原因不言而喻(使用它们时a[1]和a[0]已经被更改)。嗯,如果你使用交换(这在这里很好)你只需要处理一半的数组…啊,是的,我忘了你需要更改n。你还应该使用for循环来解决这个问题…是的,交换整个数组只会回到你开始的地方,这真是令人震惊。
:)
相反,只需标记为否定,耐心地发表评论,这样对某些人会有所帮助阅读问题和我的答案提出为什么不正确的答案你的答案对于他的解决方案来说是不必要的复杂,而且inefficient@MatthewKerian我不认为这个问题是关于效率和他想用指针实现的目标ntext是解决方案错了吗?如果我问你街上一家餐馆的方向,你会带我到处看看吗?对于你经常使用的阵列pointers@MatthewKerian当然是的,如果所有的道路都被堵住了或者客户想要。这是犯罪吗??
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--;
      }