使用指针交换int数组值

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
7个回答

21

我很抱歉要这样说,但这似乎只是个拼写错误而已。

在你的交换函数中:

*ary = temp;

应该是:

*(ary + 1) = temp;

编辑:你没有使用数组符号的原因是什么?我认为对于像这样的事情,使用数组符号会更清晰:

int temp = ary[0];
ary[0] = ary[1];
ary[1] = temp;

2
我想我们都曾经历过这种情况。 - Ron Warholic
3
确实,使用[]更加简洁。 - GManNickG
2
它应该被包含,而不是被导入。 - paxdiablo
@paxdiablo:也许他正在XCode中运行,并且实际上是作为Objective-C(.m后缀而不是.c)进行编译? - Ed S.
@Josh - 为什么?两者在数学和机器码方面是等效的。 - Chris Lutz
@Chris:可能是为了说明数组如何衰变为指针;这有助于加强C/C++中不同间接访问方法之间的关系。 - Ron Warholic

6

请仔细检查您的交换函数:

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

*(ary + 1) 何时被赋值?


4

只是为了好玩;不使用临时变量也可以进行交换

在IT技术中。
void swap( int ary[] )
{
    *ary ^= *(ary + 1);
    *(ary + 1) ^= *ary;
    *ary ^= *(ary + 1);
}

正如GMan指出的那样,这段代码会使编译器和处理器无法理解你的意图,因此性能可能比使用临时变量更差,特别是在现代CPU上。

这里的'^='运算符是什么意思?我以前从未见过它被使用过。 - Christopher Tarquini
“^” 是异或运算符,因此 “x^=y” 表示 “x=x^y”。 - John La Rooy
1
^ 是位异或运算符。 0 ^ 0 = 0 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 - f0b0s
3
你应该提到这可能不值得。现代CPU可以并行执行指令,这会导致管道停顿。更不用说这很丑陋了。 - GManNickG

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

2

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

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

然后调用:

swap(&ary[0], &ary[1]);

0

试试这个:

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

1
我知道如何使用数组符号来完成它,但我们被要求使用指针。 - Josh Curren
@Josg,我给你透露一个小秘密。你可以使用[]符号,并让编译器执行以下操作:a[x] = *(a + x) = x[a]。是的!这是一个关于a[x] = x[a]的小C语言技巧,因为编译器不使用[]方法。 - f0b0s
我的意思是你可以拿Peter的代码,只需稍微编辑一下:arr [1] - > *(arr + 1) - f0b0s
f0b0s所说的(我也同意)是,在所有实际目的下,数组名称和指针之间没有区别(忽略做foo++);唯一的问题是空间分配在哪里? (堆栈,堆或“全局空间”),以及数组中有多少个元素?这两个问题也应该引起警惕,因为这意味着a)您不知道可以有意义地索引到数组的距离,b)您不知道是否/应该释放任何内容。 Gack.给我Python。 - Peter Rowell

0

你的交换函数只适用于两个整数数组,所以向编译器展示它(这不会改变任何东西,但可以使代码更清晰)

void swap( int ary[2] )

-1 这并没有实现任何东西,而且从长远来看也不会对任何人有所帮助。你的“更清晰的代码”试图帮助我们理解你的意图,但这并不能替代良好的文档。 - Chris Lutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接