2017-02-23 54 views
1

Из того, что я понимаю, указатели содержат адреса значения, а ссылки можно рассматривать как указатели const.Где указаны ссылки и указатели?

Из этого примера кода:

int main() { 
    int i = 1; 
    int &ri = i; 
    int *pi = &i; 
    return 0; 
} 

разборок, как указатель и ссылок выглядит точно так же:

main: 
    push ebp 
    mov ebp, esp 
    sub esp, 16 
    mov DWORD PTR [ebp-12], 1 
    lea eax, [ebp-12] 
    mov DWORD PTR [ebp-8], eax 
    lea eax, [ebp-12] 
    mov DWORD PTR [ebp-4], eax 
    mov eax, 0 
    leave 
    ret 

указатели и ссылки только исполнение компилятор?

+2

пытается понять, что вы подразумеваете под «принудительным». Они являются языковыми функциями, и они работают по назначению. –

+1

BTW, проверяющий неоптимизированную сборку, - это плохой способ узнать, поскольку вы только действительно узнаете об отдельных деталях реализации реализации. Вы можете упустить тот факт, что 'int ri = 1; int & i = ri; 'будет иметь такое же поведение. –

ответ

4

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

Это упрощенный вид. Стандарт определяет их поведение. Речь идет о том, как поддерживать это поведение.

Учитывая

int i = 0; 
int& ref = i; 
int* ptr = &i; 

стандартные мандаты, которые

&ref == &i 

и

&ptr != &i; 

Следовательно, это может иметь смысл думать о ссылках как константные указатели на некоторые аспекты его поведения но это определенно не имеет смысла для всех аспектов его поведения.