C ++ указатели на функции в качестве параметров - PullRequest
2 голосов
/ 07 октября 2011
#include<iostream>

using namespace std;

void passPointer(int *pointer)
{
    cout << *pointer;
}

int main()
{
    int *iNum = new int(25);

    passPointer(iNum);

    return 0;
}

Может кто-нибудь объяснить мне, почему, когда я использую функцию passPointer() в основном, она должна быть passPointer(iNum), но не passPointer(*iNum)? Это потому, что я разыменую его в параметре, если я использую *? Пожалуйста, объясните как можно более подробно, поскольку я немного запутался.

Спасибо, ребята.

Ответы [ 5 ]

3 голосов
/ 07 октября 2011

Это потому, что вы объявили passPointer аргумент введите int*. iNum имеет тип int* и может быть передан непосредственно passPointer. *iNum имеет тип int, и не существует неявного преобразование int в int*, поэтому вы не можете передать его в passPointer.

В более общем смысле, в C ++ (и почти во всех других типизированных языках как хорошо), каждое выражение и каждая переменная имеет тип. Тип выражение выражается через тип его операндов: если тип операнда унарного * равен T* (и тип должен быть указатель), то тип результатов будет T. И вызвать функцию, Вы должны предоставить правильное количество аргументов с правильными типами.

2 голосов
/ 07 октября 2011

Я очень сочувствую этим типам вопросов, потому что это единственное, с чем у меня были проблемы при изучении C ++.

Основная проблема заключается в том, что в синтаксисе C ++ символы * и & используются для множества разных вещей со схожими, но слегка различающимися значениями.

В вашем случае вы планируете использовать * в четырех разных местах.

Во-первых: int *iNum = new int(25);, * сидит в декларации. Это означает, что это аннотация типа, говорящая, что iNum является указателем.

Во-вторых: passPointer(*iNum);, * сидит в выражении . Это означает, что это оператор разыменования, что означает: «получить значение, на которое указывает iNum». В этом случае значение, указанное iNum, равно int. Как вы увидите позже, объявлено, что passPointer принимает аргумент типа pointer to int, поэтому вы не можете передать простой int в качестве аргумента passPointer. Вместо этого вы должны просто передать iNum (так как iNum означает указатель на int).

На третьем месте: void passPointer(int *pointer), * снова сидит в декларации. Это означает, что он имеет то же значение, что и прежде всего - он говорит, что pointer является указателем (на int).

На четвертом месте: cout << *pointer;, * снова сидит в выражении . Это означает, что, как и во втором случае, он говорит «разыменование pointer и получить значение, в котором pointer хранит адрес».

1 голос
/ 07 октября 2011

Это создает переменную с именем iNum и типом int *:

int *iNum = new int(25);

Этот принимаемый параметр типа int *:

void passPointer(int *pointer)

Это передает параметр имени iNum и типа int *:

passPointer(iNum);

Не нужно думать об указателях, это все типы данных. Думайте об указателях только тогда, когда вы делаете указательную арифметику и ссылаетесь, ссылаетесь. ;)

int**** это просто тип.

0 голосов
/ 07 октября 2011

Функция passPointer() принимает указатель на int.iNum уже является указателем на int, поэтому вы просто передаете его как есть.Там нет необходимости уважать его.

0 голосов
/ 07 октября 2011

Это потому, что я разыменую его в параметре, если я использую *?

Да.iNum имеет указатель типа на int, *iNum имеет тип int.Если у вас есть функция, которая принимает int, вы можете передать ее *iNum.

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