2009-08-10 3 views
19

я видел кого-то с помощью этогоЧто это означает const int * & var?

void methodA(const int*& var); 

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

AFAIK:

  • const int var => константное значение, которое не может быть изменено

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

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

Что такое const int*& var среднее, и есть const int& *var также возможно?

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

UPDATE:

Я не уверен, если я имею в виду правильный путь, но я начал думать ссылку как псевдоним переменной, которая была передача в качестве аргумента, так Const INT * р; Methoda (р) => здесь мы переходим р как константу Int *, но мы не знаем, если это передача по значению или то, что пока мы не видим определение метода A,

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

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

UPDATE 2 Если некоторые новичок, как я хочу знать больше об этой вещи, вы можете использовать C++ Децл/Cdecl программу, которую я только что обнаружил очень полезно из here

$ 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 

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

Благодаря

ответ

26

Это ссылка на указатель на междунар, который Уст.

Существует другое сообщение, несколько связанное, фактически, here. Мой ответ дает общий алгоритм для определения этих вещей.

Это: 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 

может сделать его легче читать.


Если вам нужна дополнительная помощь по C++, read this. Более конкретно, 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*) место в стеке. Но не начинайте думать о ссылках в качестве указателей. Они не то же самое.

+0

в третьем методе baz, ConstIntPointer == const int * var, как это проходит по значению, есть указатель? Я сейчас смущен. –

+0

Указатели сами занимают пространство. Указатели - это переменные, которые хранят адрес другой переменной. Он собирается скопировать это значение, нажать его в стек и вызвать эту функцию. – GManNickG

+0

Вы передаете значение, которое хранится в указателе (то есть адрес памяти). –

3

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

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

так что если Methoda подобно этому Methoda (сопзЬ INT * & p2) ==> здесь p2 другое имя для р, т р и р2 же теперь и если метод A (const int * p2) ==> здесь p2 передается как значение, т.е. p2 является только локальным для этого метода

Да, вы правы.

3

В вашем примере 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" 
} 
6

Некоторые люди находят это более легкое чтение этого справа налево. Так

Const INT * &

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

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

Сравните это

Int * сопзЬ &

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

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

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

Смежные вопросы