6

我应该使用指针来交换数组中的整数。它编译时没有错误或警告并运行但不交换整数。任何的意见都将会有帮助!!!

这是测试仪:

#import <stdio.h>

void swap( int ary[] );

int main(  int argc, char*argv[] )
{
    int ary[] = { 25, 50 };
    printf( "The array values are: %i and %i \n", ary[0], ary[1] );
    swap( ary );
    printf( "After swaping the values are: %i and %i \n", ary[0], ary[1] );

    return 0;
}

这是交换功能:

void swap( int ary[] )
{
    int temp = *ary;
    *ary = *(ary + 1);
    *ary = temp;
}

这是运行后显示的内容:

The array values are: 25 and 50
After swaping the values are: 25 and 50
4

7 回答 7

21

我讨厌破坏这个,但它看起来更像是一个错字。

在您的交换功能中:

*ary = temp;

应该:

*(ary + 1) = temp;

编辑:您不使用数组表示法是否有原因?我认为这样的事情更清楚一些:

int temp = ary[0];
ary[0] = ary[1];
ary[1] = temp;
于 2009-11-03T23:28:59.547 回答
6

更仔细地检查你的交换函数:

void swap( int ary[] )
{
    int temp = *ary;
    *ary = *(ary + 1);
    *ary = temp;
}

什么时候*(ary + 1)被分配

于 2009-11-03T23:28:56.393 回答
4

纯娱乐; 也可以在不使用临时值的情况下进行交换

void swap( int ary[] )
{
    *ary ^= *(ary + 1);
    *(ary + 1) ^= *ary;
    *ary ^= *(ary + 1);
}

正如 GMan 指出的那样,这段代码掩盖了编译器和处理器的意图,因此性能可能比使用临时变量更差,尤其是在现代 CPU 上。

于 2009-11-03T23:38:33.053 回答
4

您将第二个值移到第一个位置,然后将第一个值移回第一个位置。

于 2009-11-03T23:29:18.233 回答
2

您还可以在没有任何临时变量的情况下交换值:

void swap(int *x, int *y)
{
   *x ^= *y;
   *y ^= *x;
   *x ^= *y;
}

然后调用:

swap(&ary[0], &ary[1]);
于 2009-11-04T13:38:23.983 回答
0

试试这个:

void swap( int ary[] )
{
    int temp = ary[0];
    ary[0] = ary[1];
    ary[1] = temp;
}
于 2009-11-03T23:31:54.717 回答
0

您的交换函数仅适用于 2-ints 数组,因此请将其显示给您的编译器(它不会改变任何内容,但会使代码更清晰)

void swap( int ary[2] )
于 2009-11-04T00:24:57.597 回答