LINUX.ORG.RU

Вопросы по указателям

 


0

1

Доброго времени суток! Как и писал выше, в топиках, начал изучение ANSI C. Правильно ли я понимаю, что в функции swap я объявляю аргументам указатели, затем в программе передаю в функцию адреса переменных, а в самой функции беру значения, находящиеся по адресу этих переданных аргументов, и меняю их местами. Так?

[code=c]
include <stdio.h>


main()
{

int a, b;
a=5;
b=10;
printf(«Before:\n»);
printf(«a=%d\n»,a);
printf(«b=%d\n»,b);
/*
Посылаю адреса аргументов a, b
*/
swap(&a,&b);
printf(«After swap:\n»);
printf(«a=%d\n»,a);
printf(«b=%d\n»,b);
return 0;
}

int swap(int* x, int* y)
{
/*
Меняю значения аргументов, находящихся по адресу переданных аргументов
*/
int temp;
temp=*x;
*x=*y;
*y=temp;
return 0;
};

[/code]

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 4)

Да, всё правильно.

Deleted
()
  1. Неявный int в качестве возвращаемого значения функции — deprecated и не обязан работать в C99 (gcc по умолчанию выдаёт предупреждение), поэтому лучше заменить тип main на такой: int main(void)
  2. Возвращаемое значение swap тебя не интересует, поэтому лучше заменить его на void

По теме — работа с указателями правильная.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от anonymous

да, оттуда. прочитал два раза, разобрался и переписал. повторение - мать учения

int13h ★★★★★
() автор топика
Последнее исправление: int13h (всего исправлений: 1)

Блин, три звезды, а лоркод не освоил...

subj: Да, правильно. Да, KnR.

zekka
()
Ответ на: комментарий от zed_0xff

Только я не знаю, что насчет переполнения (если величины будут большими..)

zekka
()
Ответ на: комментарий от zekka

1. Неправильно работает при x == y 2. Неправильно обрабатываются случаях с большими обмениваемыми значениями

urquan
()
Ответ на: комментарий от urquan

Неправильно работает при x == y

Эм... У меня норм.

2. Неправильно обрабатываются случаях с большими обмениваемыми значениями

Это да.

zekka
()
Ответ на: комментарий от theNamelessOne

Выше я отметил еще одно действие, которое совершать вовсе не обязательно.

buddhist ★★★★★
()
Ответ на: комментарий от zed_0xff
int main(void)
{
	int a, b;
	a=5;
	b=10;
	printf("Before:\n");
	printf("a=%d\n",a);
	printf("b=%d\n",b);
	swap(&a,&b);
	printf("After swap:\n");
	printf("a=%d\n",a);
	printf("b=%d\n",b);
	return 0;
}

void swap(int* x, int* y)
	{
		*x=*x ^ *y;
		*y=*y ^ *x;
		*x=*x ^ *y;
		};
int13h ★★★★★
() автор топика
Ответ на: комментарий от zed_0xff

а слабо сделать swap без использования временной переменной?

Но зачем?

Мало того, что «стандартный» xor-swap менее эффективен и плохо расширяется на всё, что не стандартный числовой тип, так ещё и все, кто его приводит в качестве примера, постоянно забывают проверять указатели на равенство.

ilammy ★★★
()
Ответ на: комментарий от ilammy

а) чисто академический интерес
б) зачем-то же есть в x86 ассемблере опкод xchg ;)

zed_0xff
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.