Как использовать поле структуры с переменной двойного указателя (без вспомогательной переменной)? - PullRequest
3 голосов
/ 15 февраля 2020

У меня есть эта структура в c

struct node{
    int info;
    struct node* link;
};

этой процедуре:

void example(struct node** head){
    struct node* tmp;
    tmp=*head;
    tmp->info=0;
    *head=tmp;
}

и я вызываю процедуру в основном с помощью

example(&head); 

так чтобы изменить head-> info мне нужна переменная поддержки, есть другой способ без вспомогательной переменной?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Если у вас есть указатель на объект, объявленный как

struct node *head; 
head = malloc( sizeof( struct head ) );

, тогда вы можете просто написать

head->info = 10;

Так как объект info передается по ссылке на функцию Например, нет большого смысла объявлять параметр функции как указатель на указатель

void example(struct node** head){
                    ^^^^^^^^^^^

Вы можете определить функцию как

void example(struct node *head){
    head->info=0;
}

Вы должны передавать head по ссылке, когда head сама функция изменяется в функции.

Например,

void insert( struct node **head, int info )
{
    struct node *tmp = malloc( sizeof( struct node ) );

    tmp->link = *head;
    tmp->info = info

    *head = tmp;
  //^^^^^^^^^^^ 
}

Если вам нужно изменить информацию об элементе данных, используя указатель на заголовок указателя, то сначала вам нужно разыменовать его, чтобы получить указатель на Информация об объекте, как, а затем применить оператор ->. Например,

( *head )->info = 0;

В C, если вы хотите изменить объект (который, в частности, может быть указателем) в функции, вы должны передать его по ссылке, что в C означает передачу объекта через указатель на него.

2 голосов
/ 15 февраля 2020

Используйте это:

void example(struct node** head){
    (*head)->info=100;
}

Это будет работать так же, как ваша example функция. Разыменовывая struct node**, мы получаем struct node*, тогда мы можем просто получить доступ к его члену, используя -> оператор стрелки.

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