C ++ указатель на указатель - PullRequest
0 голосов
/ 18 июля 2011

Я хочу получить указатель на константу и передать ее адрес функции, которая будет увеличивать ее.

int f1(const int **ptr) {
    int n = **ptr; //use pointer
    (*ptr)++; //increment pointer
    return n;
}

void foo(const int *data) {
    const int *p = data;
    const int n = f1(&p); //error: invalid conversion from ‘const int**’ to ‘int**’
                          //error:   initializing argument 1 of ‘int LevelLoader::readWord(byte**)’


}

Как мне объявить указатели?

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

Попробуйте

int f1(const int *& ptr) {
  int n = *ptr;
  ++ptr; 
  return n;
}

void foo(const int *data) {
  const int *p = data;
  const int n = f1(p); 
}

вместо этого.

Сообщение об ошибке указывает, что LevelLoader::readWord не принимает const byte**.

1 голос
/ 18 июля 2011

Проверьте еще раз, этот код правильный.Он не должен генерировать ошибки, на которые вы претендуете.

РЕДАКТИРОВАТЬ: вы устранили проблему с недействительными, поэтому ответ исправлен соответствующим образом.

1 голос
/ 18 июля 2011

Это:

const int *data;

- указатель на константу целое число.Это означает, что вам не разрешено изменять данные, на которые указывает data.Вы можете читать и копировать данные, но не можете:

(*data) = 5;

Это недопустимо в C ++, поскольку было объявлено const int *.

Если вы берете адрес1013 *, вы получите const int **, который является указателем на указатель на константу целое число.Таким образом, вы все еще не можете изменить целое число.Любая попытка сделать это приведет к жалобе компилятора.

Если вы хотите изменить целое число, то foo и f1 не должны принимать значения const int *.Они должны принимать значения int *.


Я не хочу изменять константу.Я хочу изменить указатель на него (p в foo ())

Итак, вы получили указатель.И вы хотите увеличить указатель .Так что просто сделайте так:

void foo(const int *data) {
    const int *p = data;
    data++;
}

Вы увеличили указатель.Это не повлияет на вызывающего абонента до foo, так как сам указатель копируется по значению.

...