
- •2. Программа. Обзор существующих парадигм программирования.
- •6. Операторы инкремента и декремента. Побитовые операторы языка
- •7. Операторы присваивания. Условный оператор. Оператор sizeof.
- •12. Инструкции break и continue
- •18.Функция. Объявление и определение функции: назначение,
- •19. Функция. Возврат значения из функции: синтаксис, пример.
- •22. Символьный тип: размер, диапазон. Связь символа и ascii-кода.
- •23.Символьные строки. Null-символ. Ввод и вывод символьных
- •24.Функции работы со строками: назначение, синтаксис, примеры
- •26.Разыменование указателей. Арифметические операции над указателями. Связь указателей и массивов. Примеры.
- •27.Указатели как аргументы функций. Массивы указателей.
- •28.Указатель на константу, константный указатель на переменную,
- •30.Структуры, объединения, перечисления.
26.Разыменование указателей. Арифметические операции над указателями. Связь указателей и массивов. Примеры.
Операция разадресации (разыменования) предназначена для получения доступа к величине, адрес которой хранится в указателе.
int i = 10; // i = 10
cout << "Initial value of i = " << i << endl;
int *p = &i; // p указывает на i
cout << "Initial value of *p = " << *p << endl;
*p = 15; //*p – значение по адресу в p
cout << "New value of *p = " << *p << endl;
cout << "New value of i = " << i << endl;int k = *p; // k присвоить значение по адресу в p
cout << "Initial value of k = " << k << endl;
k = k + 3;
cout << "New value of k = " << k << endl;
cout << "New value of *p = " << *p << endl;
Initial value of i = 10
Initial value of *p = 10
New value of *p = 15
New value of i = 15
Initial value of k = 15
New value of k = 18
New value of *p = 15
Арифметические операции: сложение с константой, вычитание, инкремент и декремент. Автоматически учитывается размер типа переменной, на которую настроен указатель. Применяются в основном при работе с массивами. Инкремент перенастраивает указатель на следующий элемент массива, а декремент – на предыдущий. Фактически значение указателя изменяется на величину sizeof(тип)
int arr[5]={1,2,3,4,5}, *parr = arr;
// *parr = 1
++parr;
// *parr = 2
parr+=2;
// *parr = 4
Разность двух указателей – это разность их значений, деленное на величину типа в байтах
int arr[5]={10,12,3,15,5}, *parr1
= arr, *parr2 = &arr[3];
cout << "parr2 - parr1 = " <<
parr2 - parr1 << endl; // 3
cout << "*parr2 - *parr1 = " <<
*parr2 - *parr1 << endl; // 5
27.Указатели как аргументы функций. Массивы указателей.
В функции создаются локальные копии переменных x и y!
void swap(int *px, int *py)
{
int temp = *px;
*px = *py; *py = temp;
}
Передаем адреса переменных х и y
В main:
int x = 3, y = 2;
swap(&x, &y); // передаем адреса
cout << x << " " << y;
Вывод: 2 3
Массив указателей
int *p[5]; // массив из пяти указателей
int a1, a2, a3, a4, a5;
p[0]=&a3; p[1]=&a1; p[2]=&a1; p[3]=&a5;
p[5]=NULL;
Мнемоническое правило:
Суффикс привязан крепче префикса int *p[10]; Массив указателей, а не указатель на массив.
28.Указатель на константу, константный указатель на переменную,
константный указатель на константу.
Указатель может быть константой или переменной, а также указывать на константу или переменную
int i = 3; // целая переменная
Указатель на константу:
(1) const int * pci = &ci; // указатель на константу
(2) pci = &i; // указатель можно перенастроить
(3) *pci = 5; // но изменить значение нельзя
Константный указатель на переменную:
(1)int *const cp = &i; // константный указатель на переменную
(2)cp = &j; // указатель нельзя перенастроить!
(3)*cp = 15; // менять значение по указателю можно
cout << i << j << *cp << endl;
Константный указатель на константу:
(1)const int * const cpc = &ci; // константный указатель на константу
(2)cpc = &i; // перенастроить нельзя!
(3)*cpc = 15; // изменить значение по указателю нельзя!
29.Одномерные и двумерные динамические массивы в С++. Операторы
new и delete. Динамические массивы удобно использовать, если размер массива будет известен во время исполнения программы (например, его вводит пользователь)Создаются с помощью оператора выделения памяти new
p_var = new type; // для типа
p_var = new type [size]; // для массива
пример.
int n;
cout << "Введите максимальное число элементов массива: ";
cin >> n;
int * arr = new int[n];
for (int i = 0; i < n; i++)
{
arr[i] = rand()%10+1; // от 1 до 10
cout << *(arr+i) << " ";
}
Освобождение памяти осуществляется с помощью оператора delete. При его использовании размер освобождаемой памяти указывать не нужно: delete[] arr;
Двумерный динамический массив
double **arr double *p_arr[4]
double d_a[4][3]
Инициализация и объявление массива mxn:
1.Объявляем массив указателей размерности m с помощью оператора динамического выделения памяти
newdouble ** arr = new double*[m];
2. В цикле выделяем память для каждой строки массива.
for (int i = 0; i < m; i++)
arr[i] = new double[n];
3. Заполняем начальными значениями
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
arr[i][j] = rand()%10+1;