- Взаимодействуем не с физической ОЗУ, а с виртуальной - той, что ОС выделила под прогу
- Унарный оператор
- Возращает адрес объекта (
T->T*)
- Унарный оператор
- По адресу возращает значение (разыменование)
int value = *ptr; // Разыменование
-
T* ptr; -
++/--- сдвигает наsizeof(T)байт -
+n/-n- сдвигает наn * sizeof(T)байт -
void*- указатель на что угодно (сырая память) -
nullptr- нулевой указатель
- Модификатор типа (можно сказать, новый тип (
int&))- К слову, ссылки появились лишь в C++ (в C их нет)
- Хотим создавать псевдонимы (синонимы) для переменных
- Хотим легковесный способ передачи аргументов (без указателей)
int a = 1;
int& b = a;
int c = 1;
b = c; // <=> a = c // ссылку нельзя отвязать
b++;
std::cout << a; // 2-
Нельзя перегружать функции по ссылке:
foo(int&),foo(int)=> CE
-
Ссылка принимает только l-value
int&* a = &c; // CE
-
Note ссылка привязывается на все время своего существование. То есть если у нас есть ссылка
secondкоторая указывает на переменнуюfirst, то эту ссылку нельзя перепривязать ни к чему другому. -
Указателя на ссылку нет - есть ссылка на указатель
int a = 5;
int* ptr = &a;
int*& link_to_ptr = ptr;
int&* ptr_to_link = ???; // CEint a = 0;
int b = 1;
const int* ptr = &a; // сам указатель менять можно, а что под ним - нельзя
std::cout << *ptr; // 0
*ptr = 10; // CE
ptr = &b; // OKint a = 0;
int b = 1;
int* const ptr = &a; // указатель менять нельзя, а что под ним - можно
*ptr = 10; // OK
ptr = &b; // CEconst int* const ptr = &a;- Note: Запрещено снимать степень константности, иначе UB
int main() {
int a = 5;
const int* p = &a;
++p; // OK
++*p; // CE
int* const pp = &a;
++pp; // CE
++*pp; // OK
const int* const ppp = pp; // OK (cast from int* to const int*)
++ppp; // CE
++*ppp; // CE
int* const q = ppp; // CE (запрещенный каст)
const int* qq = ppp; // OK, copy
}char * const str1; // str1 cannot be modified, but the character pointed to can
const char * str2; // str2 can be modified, but the character pointed to cannot
const char * const str3 // neither str3 nor the character pointed to can be modified.const int& c = 5; // r-value, поменять нельзя => продление жизни временному объекту "5"
void print(const vector<int>& a) { ... } // так писать правильноNote Можно делать перегрузку по константной и не константной ссылкам.
#include <iostream>
void foo(int& a) { std::cout << 1; }
void foo(const int& a) { std::cout << 2; }
int main() {
int a = 0;
foo(a); // 1
int& b = a;
foo(b); // 1
const int& c = 5;
foo(c); // 2
}- Defined in header
<cstddef> typedef /*implementation-defined*/ ptrdiff_t;std::ptrdiff_tis the signed integer type of the result of subtracting two pointers.
// valid since C++11
using ptrdiff_t = decltype(static_cast<int*>(nullptr) - static_cast<int*>(nullptr));