2012-04-02 3 views
1

У меня есть вопрос, который включает в себя вызов функции с 2-х параметров указатель на указательПерекачка указатели на указатели в C

int main(void) 
{ ... 
int *ptrp = &p, *ptrq = &q; 
int **ppp = &ptrp, **ppq = &ptrq; 
swap_ptr(ppp,ppq);/* &ptrp, &ptrq passed */ 
/* to swap_ptr() */ 
return 0; 
} 

void swap_ptr(int **ptrA,int **ptrB)... 

Мы должны поменять местами значения PTRP и ptrq, так это означает в функция swap_ptr Я просто использую * ptrA и * ptrB для их замены или это какой-то другой оператор указателя?

Благодаря

+0

У вас есть ответ на ваш вопрос, поэтому я не совсем уверен, почему его нужно было спросить ... –

+0

Вы также можете использовать [XOR swap] (http://en.wikipedia.org/wiki/XOR_swap_algorithm) для указателей подкачки, а также ... –

+0

@ 0x69 Удовлетворительный факт: если вы XOR замените два указателя одинаковыми, то оба они будут установлены в указатель NULL. – Corbin

ответ

0

Да, *ptrA будет относиться к переменной ptrp в main и *ptrA будет ссылаться на ptrq. Поменяйте эти два значения так же, как и для любого другого типа, и ptrp теперь укажет на q и ptrq на номер p.

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

+0

Большое спасибо, это все, что мне нужно знать – nain33

0

* ptrp ссылается на значение, на которое указывает указатель. ptrp ссылается на значение указателя (расположение памяти)

swap_ptr может просто сохранить одно из значений в tmp var, а затем поменять значения.

2

Это же понятие, как подкачка угодно:

void swap(int* a, int* b) 
{ 
    int tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 

В этом случае, вы просто случается, замена INT * вместо междунар:

void swap(int** a, int** b) 
{ 
    int* tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 
0

Я вроде нового с ними алгоритмы/методы, но я придумал эту функцию;

function swap(int *p1, int *p2) { 
    *p1 = *p1 + *p2; 
    *p2 = *p1 - *p2; 
    *p1 = *p1 - *p2; 
} 

Вы можете проверить эту функцию следующим образом;

int a = 10; 
int b = 20; 

printf("%d %d\n", a, b); // 10 20 

swap(&a, &b); 

printf("%d %d\n", a, b); // 20 10 

Вот 3 шага объяснение для лучшего понимания;

  1. *p1 = *p1 + *p2;
    Добавьте значения, поступающие из p1(* p1 = 10) и р2(* р2 = 20) и хранить результат по p1(* р1 = 30).
  2. *p2 = *p1 - *p2;
    Мы знаем, что результат сложения, вычислите старое значение p1 путем вычитания текущего значения p2(ток * p2 = 20) от стоимости поступающих из p1(* p1 = 30) и результаты поиска на p2(рассчитано * p2 = 10).
  3. *p1 = *p1 - *p2;
    Поскольку значение p1(* p1 = 30) не изменился на шаге 2, и мы до сих пор старое значение p1 на p2(* p2 = 10) , мы можем разделить p2 Into p1, и сохранить результат на p1(* рассчитано p1 = 20)

Итак, как вы можете видеть, мы обменяли два int s без определения какой-либо временной переменной и совершили вызов функции передачи по ссылке.

Причина передачи по ссылке заключается в минимизации использования памяти. Поскольку каждый вызов по каждому значению выделяет новые переменные в памяти (для удаления GC или нет), зависит от того, сколько параметров вы передали функции.

+0

-1 Это очень опасный способ обмена значениями, как описано в http://stackoverflow.com/questions/20753278/swapping-2-pointers-with-inline-assembly –

+0

@JoeHass Почему это опасно? Как вы можете видеть в обновлении 1, никаких проблем с максимальным значением 'int' нет. В чем причина опасной ситуации 'swap()' функции? – ozanmuyes

+0

Вы продемонстрировали, что это будет работать ** сразу **, что сильно отличается от того, что он будет ** работать **. Вы проверили, чтобы узнать, что должен сказать стандарт языка C о том, что происходит при переполнении подписанного целого? –

Смежные вопросы