2012-12-18 2 views
4

Можно создать дубликат:
Function argument type followed by *&Указатель опорного параметра

Я смотрю на чужой код прямо сейчас, и увидел необычное (по крайней мере для меня) синтаксис объявления функции. Является ли следующий синтаксис Си ++?

bool Foo::Bar(Frame *&ptoframe, int msToBlock) 
{ 
    .... 
} 

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

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

+0

Посмотрите на спиральное правило. Это очень помогает в объявлениях типа чтения. Это, по сути, ссылка на указатель. – chris

+0

Типы читаются справа налево. –

ответ

5

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

Вот довольно пример:

void no_change(int * ptr) { 
    ptr = 0; 
} 

void change_ptr(int *& ptr) { 
    ptr = 0; 
} 

int main() { 

    int *x; 

    change_ptr(x); 

} 

Значение любого указателя, переданного change_ptr будет изменен, потому что мы передаем его по ссылке.

Обратите внимание, что значение объекта, к которому указывает указатель, может быть изменено с помощью функции no_change (т. Е. *ptr = new int). Этот синтаксис применяется только к фактическому указателю, а не к его объекту, обращенному к объекту.

+1

Вы имели в виду «справа налево», а не «слева направо»? –

+0

@ JesseGood Конечно. Благодарю. :) – 0x499602D2

4

Нет, первый параметр функции является ссылкой на указатель. Иногда вы хотите изменить чужой указатель ... К островодужу:

void change_my_char(char & c) { c = 'x';  } 

void pimp_my_pointer(void * & p) { p = nullptr; } 

int main() { 
    char x; 
    void * y; 
    change_my_char(x); 
    pimp_my_pointer(y); 
} 
+0

Печально, что я читал 'pimp_my_pointer' как' p-imp my pointer' (как в p-impl)? – chris

+0

@chris: Это может быть довольно характерно, так что не чувствуйте себя слишком плохо :-) –

4

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

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