ссылочный тип указателя - PullRequest
       10

ссылочный тип указателя

0 голосов
/ 27 апреля 2010

Я пытаюсь написать функцию, которая принимает аргумент указателя, изменяет то, на что указывает указатель, а затем возвращает назначение указателя в качестве ссылки. Я получаю следующую ошибку: cannot convert int*** to int* in return

код:

#include <iostream>
using namespace std;

int* increment(int** i) {
    i++; 
    return &i;
}

int main() {
    int a=24;
    int *p=&a;
    int *p2;
    p2=increment(&p);
    cout<<p2;
}

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 27 апреля 2010

Если вы действительно имеете в виду «вернуть пункт назначения указателя в качестве ссылки», то я думаю, что тип возвращаемого вами значения - int& вместо int*.

Это может быть одной из запутанных вещей в C ++, поскольку & и * имеют разные значения в зависимости от того, где вы их используете. & - это «Тип ссылки», если вы говорите об определении переменной или типе возврата; но это означает «Адрес», если он находится перед переменной, используемой после ее определения.

Я могу быть совершенно ошибочным, но мне кажется, что вы перепутали эти два значения; и так как вы хотите вернуть ссылку, вы написали «return &i», так как & используется для ссылок. Однако в этом случае он возвращает адрес из i. А поскольку i является указателем на указатель на int, в этой строке кода:

int* increment(int** i) { i++; return &i;}

вы возвращаете адрес указателя на указатель на int. Вот почему вы получаете сообщение об ошибке cannot convert int***' to int*.

Давайте пройдемся по вашему коду построчно. Вы ищите программу, которая берет указатель и возвращает ссылку. Так что это будет:

int& increment(int* i)

Нам не нужен двойной указатель, который был у вас в коде (если вы не хотите указатель на указатель). Затем вы хотите изменить то, на что указывает указатель:

(*i)++;

А затем вернуть указатель назначения в качестве ссылки:

return *i;

Здесь мы разыменовываем i. Помните, что использование ссылок позволяет вам обращаться с ними как с обычными переменными и обрабатывает указатель для вас. Таким образом, C ++ выяснит, что вы хотите, чтобы он был ссылкой.

Затем, чтобы использовать свой код, вы можете делать в значительной степени то, что имели, но используя меньше указателей:

int a=24;
int *p=&a;
int *p2;
p2 = increment(p);

Я не проверял ничего из этого, поэтому любой может смело редактировать мой ответ и исправлять его, если у меня что-то не так.

1 голос
/ 27 апреля 2010
int* increment(int** i) { (**i)++; return *i;}

и

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