Понимание указателей в C - PullRequest
0 голосов
/ 08 мая 2018

Может ли кто-нибудь на самом деле дать мне некоторое объяснение того, как эта часть кода работает и что означает каждый указатель.

void swapNode(node** A, node** B){
worker temp = (*(*A)).data;

(*A)->data = (*B)->data;
(*(*B)).data = temp;}

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Здесь

void swapNode(node** A, node** B) A и B оба являются указателями узла типа указателя.

worker temp = (*(*A)).data; здесь с первой разыменовкой (*A) мы получили значение A, которое является указателем типа node, следовательно, после второй разыменования (*(*A)) мы получили значение объекта node, поэтому через объект мы получаем значение, хранящееся в data.

Теперь в коде ниже: -

(*A)->data = (*B)->data; с разыменованием мы получаем адрес A и B, оба указателя на тип node, поэтому с -> мы извлекаем элемент данных обоих и присваиваем значение данных B для A.

0 голосов
/ 08 мая 2018

Помните, что a->data является сокращением для (*a).data, где a - указатель на структуру или объединение, и нам нужно разыменовать указатель, прежде чем мы сможем получить доступ к data члену.Графически:

   node *      node
   +---+       +---+
a: |   | ----> |   | 
   +---+       +---+
                ...
               +---+ 
               |   | data
               +---+
                ...

Таким образом, (*(*A)).data эквивалентно (*A)->data.

Исходя из определения swapNode, похоже, что он будет назван следующим образом:

node x, y;
...
node *xp = &x;
node *yp = &y;

swapNode( &xp, &yp );

Что имеет смысл, если вы меняете указатель значения (установка xp для указания на y и yp для указания на x), но это не то, что делает swapNode;все, что он делает - это заменяет элемент data между двумя экземплярами узла.

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

void swapNode(node* A, node* B)
{
  worker temp = A->data;

  A->data = B->data;
  B->data = temp;
}

и называется

node x, y;
...
swapNode( &x, &y );
0 голосов
/ 08 мая 2018

Вы передаете два указателя на указатель на узел функции:

void swapNode(node** A, node** B){

затем вы делаете копию данных узла A (node.data)

worker temp = (*(*A)).data; //this is the same as (**A).data or (*A)->data and hopefully data is of the type worker...

Копировать данные из B в A

(*A)->data = (*B)->data;

И запишите копию с первого шага в узел, на который указывает **B (указатель, который хранится в * B и * B, находится по адресу, сохраненному в B).

Классический, но очень сложный своп.

(*(*B)).data = temp;
}

Но, как правило, было бы лучше использовать только один уровень указателей вместо двух. Потому что нет случая, когда вы манипулируете первым уровнем ссылки. Вы можете просто удалить * везде.

void swapNode(node* A, node* B)
{
  worker temp = A->data;
  A->data = B->data;  
  B->data = temp;
}

Это намного легче читать и понимать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...