C ++: Не можете работать с простыми указателями? - PullRequest
2 голосов
/ 22 августа 2010

Я прошу прощения за то, что это так просто, я работал со своим собственным методом подкачки XOR и хотел, чтобы, черт возьми, он сравнил разницу в скорости между использованием ссылки и указателя (не балуйте меня!)

Моя функция XOR ptr выглядит следующим образом:

 void xorSwapPtr (int *x, int *y) {
     if (x != y && x && y) {
         *x ^= *y;
         *y ^= *x;
         *x ^= *y;
     }
 }

Я скопировал это в функцию xorSwapRef, которая просто использует ссылки (int & x и т. Д.) В любое время:

Я использую это так, ноЯ получаю ошибку error: invalid conversion from ‘int’ to ‘int*’

int i,x,y = 0;
for(i=0;i<=200000;i++) {
    x = rand();
    y = rand(); 
    xorSwapPtr(x, y); //error here of course
}

Как бы я использовал функцию указателя с целыми числами, например, ссылку?Мне просто интересно, потому что пример функции xor, которую я нашел в книге, использует указатели, отсюда мое желание протестировать.

Ответы [ 3 ]

11 голосов
/ 22 августа 2010

x и y равны int с; xorSwapPtr занимает два int* с, поэтому вам нужно передать адреса x и y, а не x и y:

xorSwapPtr(&x, &y);
3 голосов
/ 22 августа 2010

Синтаксис может сбивать с толку ... Когда вы хотите передать указатель на что-то, вы обычно берете его адрес, например &something. Однако, когда вы объявляете сигнатуру функции и хотите определить, что один из параметров является ссылкой на тип, называемый SomeElse, вы должны использовать Type &somethingElse. Оба они используют токен &, но они означают две разные вещи (разная семантика для токена &, как и *, может означать умножение, определение указателя или разыменование указателя, в зависимости от его грамматического места в коде).

void foo(int *x, int *y); // declare a function that takes two pointers to int
void bar(int &x, int &y); // declare a function that takes two references to int

теперь давайте использовать их ...

int i, j;
foo(&i, &j);  // pass in the address of i and the address of j
bar(i, j);  // pass in a reference to i and a reference to j
// can't tell by the call that it is a reference - could be "by value"
// so you gotta look at the function signature
2 голосов
/ 22 августа 2010

Этот бит

xorSwapPtr(x, y);

должно быть

xorSwapPtr(&x, &y);

Надеюсь, это поможет

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