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

Операции с указателями.

  1. Разыменования (разадресации).

Предназначена для доступа к величине, адрес которой хранится в указателе. Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа).

  1. Присваивания.

Заполняет область памяти некоторым значением.

Присваивание без явного приведения типов допускается:

  1. Указателям типа void *;

  2. Если тип указателей справа и слева от оператора присаивания один и тот же.

Пример:

char а; // переменная типа char

char * р = new char; /* выделение памяти под указатель и под динамическую переменную типа char */

*р = 'Ю'; а = *р; // присваивание значения обеим переменным

  1. Получение адреса (&);

Применима к величинам, имеющим имя и размещенным в оперативной памяти. Таким образом, нельзя получить адрес скалярного выражения, неименованной константы или регистровой переменной.

Пример:

int t = 7, *p;

p = &t; //Присваиваем указателю p адрес переменной t

  1. Арифметические операции:

- Автоматически учитывают размер типа величин, адресуемых указателями. Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например, с массивами.

  1. Сложение с константой

Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженную на размер объекта данного типа, например:

int a = 3, *p;

p = &a; // p = 012FFC04

p += 5; // p = 012FFC18 5*4(размер int) = 2010 = 1416

cout << “p = “<<*p; // Вывод: p = 1;

  1. Инкремент - перемещает указатель к следующему элементу массива,

  2. Декремент – перемещает указатель к предыдущему элементу массиву.

Фактически значение указателя изменяется на величину sizeof(тип).

Пример:

short * р = new short [5];

p++; // значение р увеличивается на 2

long * q = new long [5];

q++; // значение q увеличивается на 4

  1. Разность двух указателей — это разность их значений, деленная на размер типа в байтах (в применении к массивам разность указателей, например: a[6] – a[3] = 3). Суммирование двух указателей не допускается.

  1. Сравнение.

Пример:

int a = 4, b = 6, *p1, *p2;

p1 = &a;

p2 = &b;

if (p1 > p2) cout << p1; //Сравниваются адреса

else cout << p2;

При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей кроме void *.

Указатель неявно может преобразоваться в тип bool (ненулевой указатель – true, нулевой – false).

Указатели и одномерные массивы.

При определении массива ему выделяется память. После этого имя массива воспринимается как константный указатель того типа, к которому относятся элементы массива.

Исключения: sizeof(имя_массива); &имя_массива;

Указатели также используются при динамическом определении массивов:

тип указатель = new тип[размер];

Пример:

//Печать массива.

int n;

cin>>n;

int *a = new int[n]; /*Выделение в динамической памяти места под массив из n элементов */

for(int i = 0; i < n; i++){

cout << *(a + i) << “ “; //Проходим по эл-ам массива через указатель

delete []a; //Освобождаем выделенную память

Так как имя_массива – указатель константа, то его невозможно изменять, следовательно, *(a++) – недопустимая форма записи.

Пример:

#include <iostream>

#include <cmath>

#include <time.h>

using namespace std;

void main()

{

setlocale(0, "");

int dkpol = 0, dn, dk;

cout << "\n\nДИНАМИЧЕСКИЙ МАССИВ: \nВведите размерность массива не меньше '0': ";

cin >> dn;

int *din_mass = new int[dn];

cout << "\nНачальный массив: ";

srand(time(0));

for (i = 0; i < dn; i++){

*(din_mass + i) = rand() % 101 - 50;

cout << *(din_mass + i) << "\t";

}

cout << "\n\nВведите номер удаляемого эл-та: ";

for (i = numb; i < dn; i++)

*(din_mass + i) = *(din_mass + i + 1);

dn--;

cout << "Полученный массив: ";

if (numb == 0 && dn == 1)

cout << "Получен пустой массив.";

else

for (i = 0; i < dn; i++)

cout << *(din_mass + i) << "\t";

}