Передача по ссылке через несколько функций - PullRequest
5 голосов
/ 04 апреля 2009

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

main() {
  int x = 0;
  int y = 0;
  int z = 0;

  foo_function(&x, &y, &z);
}

int foo_function(int* x, int* y, int* z) {
  *x = *y * *z;
  return 0;
}

Однако как бы я передал x, y и z из функции foo в другую функцию? Что-то вроде этого дает мне всевозможные предупреждения компилятора.

int foo_function(int* x,  int* y, int* z) {
  *x = *y * *z;
  bar(&x, &y, &z);
  return 0;
}

int bar(int* x, int* y, int* z) {
  //some stuff
}

Ответы [ 5 ]

11 голосов
/ 04 апреля 2009

Просто используйте:

bar(x, y, z);

X, Y и Z уже являются указателями - просто передайте их напрямую.

Помните - указатель - это место в памяти. Местоположение не меняется. Когда вы разыменовываете указатель (используя * x = ...), вы устанавливаете значение в этом месте. Но когда вы передаете его в функцию, вы просто передаете местоположение в памяти. Вы можете передать это же место в другую функцию, и она отлично работает.

2 голосов
/ 04 апреля 2009

C не имеет понятия о передаче по ссылке. Параметры всегда передаются по значению. Однако при использовании указателей это значение фактически является указателем на ваше фактическое значение.

Но что вы делаете с

foo_function(&x, &y, &z);

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

Итак,

foo_function(x, y, z);

будет правильным вызовом, поскольку x, y и z уже являются указателями, и вам больше не нужно создавать цепочку указателей:)

2 голосов
/ 04 апреля 2009
int foo_function(int* x,  int* y, int* z) {
   *x = *y * *z;
   /* x, y and z are pointers to int
      &x, &y and &z are pointers to pointer to int
      bar expects pointers to int, so call bar as:
   */
   bar(x, y, z);
   return 0;
}
2 голосов
/ 04 апреля 2009

В foo_function x y и z уже являются указателями (int *), поэтому вы можете использовать bar (x, y, z).

2 голосов
/ 04 апреля 2009

Вам не нужно ничего делать, они уже ссылки.

int foo_function(int* x,  int* y, int* z) {
  bar(x, y, z);
  return 0;
}

int bar(int* x, int* y, int* z) {
  //some stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...