C ++ указатель вопрос - PullRequest
3 голосов
/ 29 июня 2010

все еще работает на C ++, но это появилось в моей книге, и я не понимаю, для чего это:

MyClass * FunctionTwo (MyClass *testClass) {
    return 0;
}

Мой вопрос заключается в том, каково значение первого оператора косвенности

(MyClass *[<- this one] FunctionTwo(MyClass *testClass))?

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

Спасибо,

Карл

Ответы [ 5 ]

10 голосов
/ 29 июня 2010

MyClass * означает, что эта функция возвращает указатель на экземпляр MyClass.

Поскольку код фактически возвращает 0 (или NULL), это означает, что любой вызывающий объект этой функции получает нулевой указательобъект MyClass.

Я думаю, что следующие примеры являются лучшими:

int *testFunc(int *in) {
    cout << "This is the pointer to in " <<  in << endl;
    cout << "This is the value of in "  << *in << endl;
    return in;
}

int testFuncTwo(int *in) {
    cout << "This is the pointer to in " <<  in << endl;
    cout << "This is the value of in "  << *in << endl;
    return *in;
}


void test() {
  int a = 1;

  cout << "a = " << a;

  int output = *testFunc(&a); // pass in the address of a
  cout << "testFunc(a) returned " << output;

  output = testFuncTwo(&a); // pass in the address of a
  cout << "testFuncTwo(a) returned " << output;

}

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

2 голосов
/ 29 июня 2010

Общий формат для функции, которая принимает одно значение и возвращает одно значение в C ++:

return_type function name (    parameter_type parameter_name )

В вашем случае return_type - это MyClass *, что означает «указатель на MyClass» Кроме того, в вашем случае параметр_type также является MyClass *.

Другими словами, ваш код может быть переписан как:

typedef MyClass *PointerToMyClass;
PointerToMyClass FunctionTwo (PointerToMyClass testClass)
{
 return 0;
}

Это выглядит более знакомым?

2 голосов
/ 29 июня 2010

Учитывая характер вопроса, я собираюсь дать несколько грубый ответ.

Указатель указывает на что-то:

int x = 123; // x is a memory location (lvalue)
int* y = &x; // y points to x
int** z = &y; // z points to y

В приведенном выше коде z указывает на y, который указывает на x, где хранится интеграл, 123.

x-> y-> z [123] (это не код, это текстовая диаграмма)

Мы можем заставить y указывать на другое целое число, если мы хотим, чтобы NULL указывал на ничто, и мы можем заставить z указывать на другой указатель на целое число, если мы хотим, чтобы NULL указывал на ничто.

Так зачем нам указатели, которые указывают на другие вещи? Вот пример: допустим, у вас есть простой игровой движок, и вы хотите сохранить список игроков в игре. Возможно, в какой-то момент игры игрок может умереть, вызвав функцию убийства для этого игрока:

void kill(Player* p);

Мы хотим передать указатель игроку, потому что мы хотим убить оригинального игрока. Если бы мы сделали это вместо этого:

void kill(Player p);

Мы не убили бы оригинального игрока, но его копию. Это ничего не даст исходному плееру.

Указатели могут быть назначены / инициализированы значением NULL (NULL или 0), что означает, что указатель не будет указывать на что-либо (или перестанет указывать на что-либо, если он указывал на что-то раньше).

Позже вы узнаете о ссылках, которые похожи на указатели, за исключением того, что указатель может изменить то, на что он указывает, в течение своей жизни. Ссылка не может и устраняет необходимость явного разыменования указателя для доступа к объекту (на что он указывает).

Примечание. Я как бы обошел вокруг вашего первоначального вопроса, но приведенный вами пример кода не имеет никакого осмысленного поведения. Попытка понять этот пример без первого понимания указателей в общем смысле работает ИМХО в обратном направлении, и вам лучше сначала изучить эту общую теорию.

1 голос
/ 29 июня 2010

Если бы у вас было что-то вроде int * Function (), это вернул бы указатель на целое число. MyClass * просто означает, что функция будет возвращать указатель на объект типа MyClass. В c ++ пользовательские объекты обрабатываются как first-class-objects , поэтому после создания ваших собственных объектов они могут быть переданы в качестве параметра, возвращены из подпрограммы или назначены в переменную, как стандартные типы .

В размещенных вами кодовых блоках не будет никакой разницы в выводе на консоль, потому что вы изменили тип, который возвращает функция (которая не используется), содержимое функций идентично.

1 голос
/ 29 июня 2010

Когда вы определяете:

int *testFunc(int *in)

Вы определяете функцию, которая возвращает указатель на переменную int.

int testFuncTwo(int *in)

Возвращает только переменную типа int.

Ноль в этом случае подвергается неявному приведению - первая функция возвращает (int*) 0, вторая просто 0. Вы можете увидеть это неявное приведение в действие, если вы измените прототип вашей примерной функции с возврата MyClass* на простой возврат MyClass - если в MyClass нет метода operator int, вы получите приятную ошибку .

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