Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
2.6 kB
5
Indexable
Never
#include <iostream>
#include <typeinfo>


using namespace std;

int main() {
    // ссылки и указатели
    int a = 10;
    int &b = a; // ссылка к ссылке
    int *c = &b; // указатели содержат в себе только адреса, поэтому можем присваивать только адрес

    // адреса в памяти
    cout << &a << endl; // адрес переменной а в памяти
    cout << &b << endl;
    cout << &(*c) << endl;

    cout << *(&a) << endl; // оператор разыменовывания - значение по указанному адресу
    // указатели могут быть разных типов int, double, поэтому указатель типа double не может указывать
    // на переменную типа int и наоборот



    cout << c << endl; // вывод адреса
    cout << *c << endl; // вывод содержимого
    // НЕ ДОПУСТИМО int *k = 7; целочисленный литерал не имеет адреса в памяти, указатели содержат в себе только адреса
    // НЕ ДПУСТИМО int *l = 0x7ffee1f79a28; нельзя присваивать адрес

    //Стоит отметить, что оператор адреса (&) не возвращает адрес своего операнда в качестве литерала.
    // Вместо этого он возвращает указатель, содержащий адрес операнда, тип которого получен из аргумента

    cout << typeid(&a).name() << endl;
    // в аутпуте мы ожидаем не int*, а Pi
    //i: integer
    //Pi: pointer to integer variable == int*
    //Ppi: pointer to a pointer to integer variable

    // причем ТАК МОЖНО!!
    *c = 7;
    cout << a << endl << *c << endl;

    // массивы
    int mas1[5] = {1, 2, 3, 4, 5}; // инициализируем массив, указав все его значения и размер
    cout << mas1[3] << endl; // обращение по индексу
    int mas2[] = {123, 45, 67, 0, -12, 3, 4}; //будет создан массив достаточно большого размера для хранения инициализации
    // индексация начинается с 0
    // также можно присваивать новые значения
    mas2[3] = 1;
    return 0;
}