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

46. Операции с указателями: присваивание адреса, определение значения по адресу, присваивание указателей

1. Присваивание адреса.

int а;

int *pa;

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

Операцию & можно применять только к переменным и элементам массива.

Следующие операции неверны : &5 &(k+1)

Операция & применима к объектам, имеющим имя и размещенным в памяти. Ее нельзя применять к выражениям, неименованным константам ,битовым полям структур и объединений, к регистровым переменным и внешним объектам (файлам).

2. Определение значения.

int а=1,b;

int *pa;

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

b=*pa; // значение b=1

b=*pa+5; // значение b=6

Операцию * можно использовать в выражениях. Эта операция более приоритетна, Операцию * можно использовать в выражениях. Эта операция более приоритетна,

3. Присваивание указателей.

int а;

int *pa,*padr;

pa=&a;

padr=pa; // копирование адреса

47. Операции с указателями: сложение и вычитание, инкремент и декремент, сравнение указателей

1. Инкремент и декремент

При выполнении операций ++ и -- значение указателя увеличивается или уменьшается на длину типа, на который ссылается используемый указатель.

int *ptr, a[10];

ptr=&a[5];

ptr++; // равно адресу элемента a[6]

ptr--; // равно адресу элемента a[5]

2. Сложение и вычитание

В бинарных операциях сложения и вычитания могут участвовать указатель и величина типа int. При этом результатом операции будет указатель на исходный тип, а его значение будет на указанное число элементов больше или меньше исходного.

В операциях вычитания могут участвовать два указателя на один и тот же тип. Результат такой операции имеет тип int и равен числу элементов исходного типа между уменьшаемым и вычитаемым, причем если первый адрес младше, то результат имеет отрицательное значение.

3. Сравнение указателей.

Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=, >, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).

int *ptr1, *ptr2, a[10];

ptr1=a+5; // равно адресу элемента a5

ptr2=a+7; // равно адресу элемента a7

if (prt1>ptr2) a[3]=4; // ptr1 меньше значения ptr2,

// поэтому оператор a[3]=4 не будет выполнен

48. Работа с динамической памятью. Динамические массивы.

При объявлении динамических массивов указывается тип и размерность.

double n = 15;

double* a= new double[n];

Отводится область памяти для 15 элементов типа double. Адрес начальной ячейки записывается в указатель a.

Динамические массивы не обнуляются и не инициализируются при создании.

Доступ к элементам массива осуществляется либо непосредственно, либо через указатель.

int b=a[10];

int c=*(a+10);

Освобождение памяти осуществляется оператором delete[].

Одномерный массив

int n = 5;

int* a; // одномерный массив

a = new int[n]; // резервируем память

// присвоение значений

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

{

a[i]=i;

}

// распечатываем

for (int i=0; i<n; i++) cout << a[i]);

// освобождаем память

delete a;

}

Двумерный массив:

...

int nstr, nstb;

cout << “Введите кол-во строк и столбцов”;

cin>>nstr>>nstb;

int** a = new int*[nstr]; // массив указателей на строки

for (int i=0; i<nstr; i++)

{

a[i] =new int[nstb]; // для строки столбцы

}

// заполнение значениями

for (int i=0; i<nstr; i++)

{

for (int j=0; j<nstb; j++)

a[i][j]=1;

}

// уничтожение массива

for (int i = 0; i < nstr; i++) delete a[i]; //столбцы для строки

delete[] a; //cтроки

}

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