Подтвердить что ты не робот

Что это означает const int * & var?

Я видел, как кто-то использовал этот

void methodA(const int*& var);

в одном ответе, но не мог понять, что означает аргумент.

AFAIK:

  • const int var = > const значение, которое нельзя изменить

  • const int* var = > указатель на int, который является const i.e * var не может быть изменен, но var можно изменить

  • const int& var = > ссылка на const int i.e значение var не может быть изменено

Что означает const int*& var и возможно const int& *var?

Не могли бы вы привести также пример, например, что можно сделать и что с ним нельзя сделать?

ОБНОВЛЕНИЕ:

Я не уверен, правильно ли я думаю, но я начал рассматривать ссылку как псевдоним переменной, прошедшей как аргумент, поэтому const int * p; methodA (p) = > здесь мы передаем p как const int *, но мы не знаем, проходит ли это по значению или что до тех пор, пока мы не увидим определение метода A,

поэтому, если метод A подобен этому methodA (const int * и p2) == > здесь p2 - это другое имя для p, то есть p и p2 с этого момента совпадают и если methodA (const int * p2) == > здесь p2 передается как значение i.e p2 является только локальным для этого метода,

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

ОБНОВЛЕНИЕ 2 Если какой-то новичок, как я, хочу узнать больше об этом, вы можете использовать С++ decl/ программу cdecl, которую я только что обнаружил очень полезную из здесь

$ c++decl
Type `help' or `?' for help
c++decl> explain const int&* p
declare p as pointer to reference to const int
c++decl> explain const int*& p
declare p as reference to pointer to const int

Но, как указал каждый из них, первый пример не является законным в С++.

Спасибо

4b9b3361

Ответ 1

Это ссылка на указатель на int, который является константой.

Здесь есть другая статья, связанная, по сути, здесь. Мой ответ дает общий алгоритм, позволяющий понять эти вещи.

Это: const int& *var не имеет смысла, потому что у вас не может быть указатель на ссылку.

Если константа и указатели мешают, помните, что вы можете напечатать эти вещи:

typedef int* IntPointer;
typedef const IntPointer ConstIntPointer;

void foo(ConstIntPointer&); // pass by reference
void bar(const ConstIntPointer&); // pass by const reference
void baz(ConstIntPointer); // pass by value

Возможно облегчить чтение.


Если вам нужна дополнительная помощь на С++, прочитайте это. Более конкретно, references.

Ссылки как переменные не занимают места:

int i; // takes sizeof(int)
int*pi = &i; // takes sizeof(int*)

int& ri = i; // takes no space.
             // any operations done to ri
             // are simply done to i

Ссылки в качестве параметров используют указатели для достижения конечного эффекта:

void foo(int& i)
{
    i = 12;
}

void foo_transformed(int *i)
{
    *i = 12;
}

int main()
{
    int i;

    foo(i); // same as:
    foo_transformed(&i); // to the compiler (only sort of)
}

Таким образом, он фактически передает адрес i в стеке, поэтому занимает стек sizeof(int*) в стеке. Но не начинайте думать о ссылках в качестве указателей. Они не совпадают.

Ответ 2

Некоторым людям легче читать это справа налево. Итак,

const int * &

является ссылкой на указатель на целое число, которое является константой.

Как вы знаете, ссылки не могут быть изменены, только то, что они называют, может быть изменено. Таким образом, ссылка будет ссылаться только на один указатель на целое число, которое является константой. Поскольку указатель не const - целое число const - вы можете изменить указатель на то, чтобы указать на другое целое число.

Сравните это с

int * const &

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

Чтобы добавить путаницу, константа int и int const одинаковы. Однако int const * и int * const очень разные. Первый - это указатель на постоянное целое число, поэтому указатель изменчив. Второй - постоянный указатель на целое число, поэтому целое число изменено.

Надеюсь, это поможет!

Ответ 3

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

Что касается вашего обновления:

поэтому, если метод A подобен этому методу A (const int * и p2) == > здесь p2 - это другое имя для p, то есть p и p2 с этого момента совпадают, и если метод A (const int * p2) == > здесь p2 передается как значение, т.е. p2 является только локальным для этого метода

Да, вы правы.

Ответ 4

В вашем примере var является ссылкой на указатель на const char.

Поскольку это ссылка, изменение параметра внутри methodA() будет отражено в аргументе, который передается в methodA():

void methodA( const char*& var)
{
    static const char newdata[] = {'a', 'b', 'c', '\0'};

    printf( "var points to %s\n", var);

    var = newdata;
}


int main()
{
    const char * p = "123";

    printf( "p points to: %s\n", p);      // prints "p points to: 123"
    methodA( p);
    printf( "now p points to: %s\n", p);  // prints "now p points to: abc"
}