Использование указателей для обмена значениями массива int

Я должен использовать указатели для обмена ints в массиве. Он компилируется без ошибок или предупреждений и работает, но не меняет их. Любые предложения были бы полезными.

Вот тестер:

#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;
}
</stdio.h>

Вот функция подкачки:

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 ответов

Я ненавижу испортить это, но он выглядит как опечатка больше всего.

В вашей функции свопинга:

*ary = temp;

должен быть:

*(ary + 1) = temp;

edit: Есть ли причина, по которой вы не используете нотацию массива? Я думаю, это немного яснее для таких вещей:

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


Осмотрите свою функцию подкачки более тщательно:

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

Когда *(ary + 1) присваивается значение?


просто для удовольствия; Также возможно обменять без использования временного значения

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

Как указывает GMan, этот код скрывает ваше намерение от компилятора и процессора, поэтому производительность может быть хуже, чем использование переменной temp, особенно на современном процессоре.


Вы перемещаете второе значение в первое место, а затем переместите первое значение обратно в первое место.


Вы также можете менять значения без какой-либо временной переменной:

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

затем вызовите:

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


Попробуйте это вместо:

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


ваша функция swap будет работать только для массива 2-ints, поэтому покажите его вашему компилятору (он ничего не изменит, но сделает очиститель кода)

void swap( int ary[2] )

licensed under cc by-sa 3.0 with attribution.