Vserosbuybuy

C++ base guide 3

Feb 21st, 2021
507
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. int sum(int* mas, int size) {
  8.     int sum = 0;
  9.     for (int i = 0; i < size; ++i) {
  10.         sum += *(mas + i);
  11.     }
  12.  
  13.     return sum;
  14. }
  15.  
  16. int main()
  17. {
  18.     int a = 13;
  19.     int& la = a;            // создаем ссылку на переменную
  20.     int* pa = &a;           // создаем указательна переменную
  21.  
  22.     cout << &a << endl;     // при помощи & можем достать адрес переменной, собственно, он и хранится в указателе
  23.  
  24.     int b = 1;
  25.     pa = &b;                // можем поменять, на какую переменную указывает указатель
  26.    
  27.     cout << pa << endl;     // будет выведен адрес переменной, то есть &b
  28.     cout << *pa << endl;    // будет выведено значение, лежащее по адресу, то есть значение переменной b
  29.                             // такая операция называется разыменовыванием указателя
  30.  
  31.     *pa = 2;                // можем изменить значение b при помощи указателя
  32.     *pa = la;               // например, можем присвоить b значение a через ссылку на a, в b тогда окажется 13
  33.  
  34.     int* n = nullptr;       // можем создать пустой указатель, который никуда не указывает
  35.  
  36.     if (n == nullptr) {     // используется при различных проверках
  37.         cout << "Пустой" << endl;
  38.     }
  39.  
  40.     // попробуем вывести этот вектор разными новыми способами
  41.     vector<int> v = { 1, 3, 4, 2, 4, 5 };
  42.    
  43.     // можем пробежаться по нему указателями, при ++p указатель сдвигается на один элемент вектора правее
  44.     // их можно сравнивать, тогда будут сравниваться адреса в памяти
  45.     // вектор расположен в памяти последовательно, его элементы лежат друг за другом и у последнего самый большой адрес
  46.     // этим и пользуемся, берем указатель на начало и идем до адреса последнего элемента включительно
  47.     for (int* p = &v[0]; p <= &v.back(); ++p) {
  48.         cout << *p << " ";
  49.     }
  50.  
  51.     // можем прибавлять не только 1 к указателю, но и любое другое число (вычитать тоже можем)
  52.     int* start = &v[0];
  53.     for (int i = 0; i < v.size(); ++i) {
  54.         // start указывает на начало вектора, мы сдвигаем его на i элементов вправо и разыменовываем
  55.         cout << *(start + i) << " ";
  56.     }
  57.  
  58.     // еще есть итераторы, это более "умные" указатели, которые позволяют двигаться по контейнерам,
  59.     // лежащим в памяти не последовательно, при помощи все тех же прибавлений и вычитаний.
  60.     // их функционал очень похож, их тоже можно прибавлять и разыменовывать,
  61.     // у вектора есть .begin() - итератор, указывающий на первый элемент вектора
  62.     // и .end() - итератор, указывающий как бы за последний эелемент вектора
  63.     for (auto x = v.begin(); x < v.end(); ++x) {
  64.         cout << *x << " ";
  65.     }
  66.  
  67.     // можем использовать указатели для передачи, например, массивов в функцию
  68.     // имя массива служит указателем на его начало
  69.     int mas[6] = { 1, 3, 4, 2, 5, 6 };
  70.     cout << sum(mas, 6) << endl;
  71.     return 0;
  72. }
RAW Paste Data