Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prog (2).docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
75.68 Кб
Скачать

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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]