Что означает * и означает в параметре функции - PullRequest
11 голосов
/ 15 ноября 2010

Если у меня есть функция, которая принимает int *&, что это значит?Как я могу передать только int или указатель int этой функции?

function(int *& mynumber);

Всякий раз, когда я пытаюсь передать указатель на эту функцию, он говорит:

error: no matching function for call to 'function(int *)'
note: candidate is 'function(int *&)'

Ответы [ 5 ]

21 голосов
/ 15 ноября 2010

Это ссылка на указатель на int.Это означает, что рассматриваемая функция может изменять как указатель, так и сам int.

Вы можете просто передать указатель, единственное осложнение заключается в том, что указатель должен быть l-значением, а не просто r-value, поэтому, например, одного

int myint;
function(&myint);

недостаточно, и 0 / NULL не будет допустимым, где как:

int myint;
int *myintptr = &myint;
function(myintptr);

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

int *myintptr = NULL;
function(myintptr);

также может иметь смысл, если функция ожидала выделить память при указателе NULL,Проверьте документацию, поставляемую с функцией (или прочитайте источник!), Чтобы увидеть, как ожидается использование указателя.

10 голосов
/ 15 ноября 2010

Просто: ссылка на указатель.

В C, без ссылок, традиционный способ «переместить» указатель - это передать указатель на указатель:

void c_find(int** p, int val); /* *p will point to the node with value 'val' */

В C ++ это может быть выражено эталонным синтаксисом, чтобы избежать неловкого двойного разыменования.

void cpp_find(int*& p, int val); // p will point to the node with value 'val'
7 голосов
/ 15 ноября 2010

Это означает ссылку на указатель на int.Другими словами, функция может изменить параметр так, чтобы он указывал на что-то еще.

Чтобы передать переменную, просто передайте int *.Как указывает awoodland, переданное значение должно быть l-значением .

Редактировать:

Для построения на примере примера awoodland:

#include <iostream>

void foo(int*& var)
{
    delete var;
    var = new int;
}

int main(int argc, char* argv[])
{
    int* var = NULL;

    std::cout << var << std::endl;

    foo(var);   // this function can/will change the value of the pointer

    std::cout << var << std::endl;

    delete var;

    return 0;
}
2 голосов
/ 15 ноября 2010

function принимает один параметр, mynumber, который является ссылкой на указатель на int.

Это полезно, когда вам нужно передать указатель на функцию, и эта функция может изменить указатель. Например, если ваша функция реализована так:

function(int*& mynumber)
{
  if( !mynumber )
    mynumber = new int;
  *mynumber = 42;
}

... Тогда что-то подобное может произойти в коде вызова:

int main()
{
  int* mynumber = 0;
  function(mynumber); // function will change what "mynumber" points to
  cout << *mynumber;
  return 0;
}
0 голосов
/ 15 ноября 2010

Это ссылка на указатель на int - вам нужно будет передать адрес int этой функции и знать, что функция может изменить указатель через ссылку.

Тупой пример:

void func(int*& iref) 
{
    iref = new int;
}

int main()
{
    int i(0);
    int* pi(&i);

    func(pi);
    // pi no longer equal to &i

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