Передача адреса указателя - PullRequest
1 голос
/ 22 апреля 2011
int main()
{
  int x = 2, y = 4;
  func(&x, &y);
  printf("%d %d\n", x, y);
  return 0;
}

void func(int *x, int *y)
{
  int *temp;
  temp = x;
  x = y;
  y = x;
}

Привет

Для этого кода я понятия не имею, почему вывод равен 2 4 вместо 4 4. Так как x = y в func () означает, что x теперь указывает на адрес y, а y = x в func () означает y сейчас указывает на адрес x (который является y), обе переменные уже указывают на y.

Большое спасибо!

Ответы [ 6 ]

2 голосов
/ 22 апреля 2011

Ответ прост: вы изменяете значения указателя внутри func - но не значения, на которые они указывают. Я думаю, вы хотели бы поменять местами переменные (из-за temp var).

Этот код должен работать (замена значений):

void func(int *x, int *y)
{
    int temp = *x; // dereferencing the pointer to get the value it points at.
    *x = *y;
    *y = temp;
}

Слишком сдерживает ваши первоначальные ожидания (которые не имеют смысла в коде из-за второго назначения):

void func(int *x, int *y)
{
    *x = *y;
    *y = *x;
}
1 голос
/ 22 апреля 2011

Попробуйте это

#include <iostream>

using namespace std;

void func(int *x, int *y);

int main()
{
  int x = 2, y = 4;

  func(&x, &y);

  //printf("%d %d\n", x, y);

  cout << "X - " << x << endl;

  cout << "Y - " << y << endl;

  return 0;

}

void func(int *x, int *y)    
{
  int temp;

  temp = *x;
  *x = *y;
  *y = temp;

}
1 голос
/ 22 апреля 2011

Вы просто временно назначаете адрес 'x' на адрес 'y' в func. Чтобы выполнить назначение, вам нужно разыменовать ваши указатели.

*x = *y;
*y = *x;
1 голос
/ 22 апреля 2011

Нет, func() получит копии этих адресов, и это не повлияет на переменные вне функции - все изменения, внесенные в локальные переменные func(), будут отменены после выхода func().

0 голосов
/ 22 апреля 2011

Проблема в том, что вы пытаетесь написать собственную версию std::swap. Это будет работать:

  int x = 2, y = 4;
  std::swap(&x, &y);
  printf("%d %d\n", x, y);
  return 0;
0 голосов
/ 22 апреля 2011

Вы делаете копии переданных указателей, они являются локальными для вашей функции.Любое изменение, которое вы вносите в них, не влияет на внешнюю сторону.Вы должны захватить указатели по ссылке &.

void func(int*& x, int*& y){
  // as before...
}

Теперь изменения внутри функции будут правильно отражаться за ее пределами.По проблеме остается, хотя.Вы передаете адрес локальных переменных и пытаетесь изменить их указатели - это не работает.Когда вы берете адрес переменной &x, вы создаете новый временный указатель, который не может быть преобразован в ссылку на указатель.Сделайте это вместо этого:

int main(){
  int x = 2, y = 4;
  int *px = &x, *py = &y;
  func(px, py);
  printf("%d %d\n",*px,*py);
}

Редактировать : Если вместо этого вы хотите поменять / установить значения x и y, а не только некоторые указатели, делайте как другие ответысостояние.

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