Обмен указателей на указатели в C - PullRequest
1 голос
/ 02 апреля 2012

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

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 Iпросто используйте * ptrA и * ptrB, чтобы поменять их местами, или это какой-то другой указатель?

Спасибо

Ответы [ 4 ]

2 голосов
/ 02 апреля 2012

Это та же концепция, что и обмен чем-либо:

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

В этом случае вы просто меняете int * вместо int:

void swap(int** a, int** b)
{
    int* tmp = *a;
    *a = *b;
    *b = tmp;
}
0 голосов
/ 24 декабря 2013

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

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

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

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

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

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

0 голосов
/ 02 апреля 2012

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

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

0 голосов
/ 02 апреля 2012

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

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

...