Манипулирование указателем в C - PullRequest
0 голосов
/ 02 декабря 2010

Привет всем!Я начинающий программист и мне нужна помощь с указателями.Вот что я пытаюсь сделать: у меня есть два аргумента-указателя на функцию (вызывающую функцию), скажем, arg1 и arg2.Теперь я хочу манипулировать этими указателями внутри какой-то другой функции, скажем, func, чтобы изменения отражались в вызывающей стороне, откуда был вызван func.Однако прямо сейчас изменение, которое я делаю в функции, отменяется в вызывающей функции.Вот исходный код:

func(node* arg1, node* argv2)
{
  node* point3 = (struct node*) malloc(struct node);
  arg2 = arg1;
  arg 1  = point3;
}

caller(node* argv1, node* argv2)
{
  func(arg1, arg2);
}

Теперь я знаю, что это можно сделать, используя методику передачи по ссылке.Но для этого функция становится func(node** arg, node** arg2), и я не хочу вдаваться в двойные указатели.Я больше думал о том, как массив при манипулировании или изменении в функции изменяется для всех функций в программе.Пожалуйста, помогите мне!

Ответы [ 4 ]

1 голос
/ 02 декабря 2010

Есть два способа сделать это:
1) Поменяйте местами указатели, для этого нужно использовать двойные указатели (**)


func(node** arg1, node** arg2)
{
  node* tmp = *arg2;
  *arg2 = *arg1;
  *arg1  = tmp;
}

2) Поменяйте содержимое, я думаю, вы можете сделать это так:


func(node* arg1, node* arg2)
{
  node* tmp = (struct node*) malloc(sizeof(struct node));
  node* clean = tmp; 
  *tmp = *arg2;
  *arg2 = *arg1;
  *arg1  = *tmp;
  free(clean);
}

Метод # 1 более эффективен, так как он поменяет указатели вместо всей структуры. И, как кто-то упоминал, вы должны использовать sizeof() внутри malloc.

0 голосов
/ 02 декабря 2010

Как уже говорили, использование указателей на указатели в этом случае - это то, как это делается в C. Однако есть возможность избежать этого: использовать макросы ....

#define func(arg1, argv2) do { node * point3 = malloc(); /* etc ... */ } while(0)

Но твой код от этого не станет красивее. Не поддавайтесь искушению темной стороной C.

0 голосов
/ 02 декабря 2010

Двойной указатель действительно правильный способ сделать это.Но если вас это смущает, вы можете вместо этого передать в функцию массив из двух указателей.Затем содержимое массива будет изменено при возврате.

0 голосов
/ 02 декабря 2010

Если вы хотите изменить сами указатели, вам нужно передать указатель на указатель. Поэтому func(node** arg1, node** arg2) является правильным.

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