C++ dasturlash tili Ko'rsatgichlar, referatlar va dinamik xotira ajratish


Download 267.5 Kb.
bet6/14
Sana20.06.2023
Hajmi267.5 Kb.
#1630767
TuriReferat
1   2   3   4   5   6   7   8   9   ...   14
Bog'liq
Язык программирования C

Как работают ссылки?
Ссылка работает как указатель. Ссылка объявляется как псевдоним переменной. В нем хранится адрес переменной, как показано на рисунке:

Ссылки и указатели
Указатели и ссылки эквивалентны, за исключением:

  1. Ссылка — это константа имени для адреса. Вам необходимо инициализировать ссылку во время объявления. После того, как ссылка установлена на переменную, вы не можете изменить ссылку, чтобы ссылаться на другую переменную.

int & iRef; // Error: 'iRef' declared as reference but not initialized

  1. Чтобы получить значение, на которое указывает указатель, необходимо использовать оператор разыменования (например, если является указателем, возвращает значение, на которое указывает . Это называется разыменованием или косвенным). Чтобы присвоить адрес переменной указателю, нужно использовать оператор address-of (например, ).
    С другой стороны, ссылки и разыменовывание выполняются для ссылок неявно. Например, if является ссылкой (псевдонимом) на другую переменную, возвращает значение переменной. Не следует использовать явный оператор разыменования. Кроме того, чтобы присвоить адрес переменной ссылочной переменной, оператор address-of не требуется.*pNumberint*pNumberpNumber&pNumber = &numberrefNumberintrefNumber*&

Например
/* References vs. Pointers (TestReferenceVsPointer.cpp) */
#include
using namespace std;
int main() {
int number1 = 88, number2 = 22;
// Create a pointer pointing to number1
int * pNumber1 = &number1; // Explicit referencing
*pNumber1 = 99; // Explicit dereferencing
cout << *pNumber1 << endl; // 99
cout << &number1 << endl; // 0x22ff18
cout << pNumber1 << endl; // 0x22ff18 (content of the pointer variable - same as above)
cout << &pNumber1 << endl; // 0x22ff10 (address of the pointer variable)
pNumber1 = &number2; // Pointer can be reassigned to store another address
// Create a reference (alias) to number1
int & refNumber1 = number1; // Implicit referencing (NOT &number1)
refNumber1 = 11; // Implicit dereferencing (NOT *refNumber1)
cout << refNumber1 << endl; // 11
cout << &number1 << endl; // 0x22ff18
cout << &refNumber1 << endl; // 0x22ff18
//refNumber1 = &number2; // Error! Reference cannot be re-assigned
// error: invalid conversion from 'int*' to 'int'
refNumber1 = number2; // refNumber1 is still an alias to number1.
// Assign value of number2 (22) to refNumber1 (and number1).
number2++;
cout << refNumber1 << endl; // 22
cout << number1 << endl; // 22
cout << number2 << endl; // 23
}
Ссылочная переменная присваивает новое имя существующей переменной. Он разыменовывается неявно и не нуждается в операторе разыменования для извлечения указанного значения. С другой стороны, переменная-указатель хранит адрес. Можно изменить значение адреса, хранящееся в указателе. Чтобы получить значение, на которое указывает указатель, необходимо использовать косвенный оператор , который известен как явное разыменование. Ссылку можно рассматривать как указатель. Он должен быть инициализирован во время объявления, и его содержание не может быть изменено.**const
Ссылка тесно связана с указателем. Во многих случаях его можно использовать в качестве альтернативы указателю. Ссылка позволяет манипулировать объектом с помощью указателя, но без синтаксиса указателя ссылок и разыменовывания.
В приведенном выше примере показано, как работает ссылка, но не показано ее типичное использование, которое используется в качестве формального параметра функции для передачи по ссылке.

Download 267.5 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   14




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling