Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-5.docx
Скачиваний:
4
Добавлен:
07.01.2022
Размер:
128.38 Кб
Скачать

22. Арифметические операции с указателями. Пример.

К указателям могут применяться только две арифметические операции: сложение и вычитание. Для понимания арифметических действий с указателями предположим, что p1 - это указатель на целое, содержащий значение 2000, и будем считать, что целые имеют длину 2 байта. После выражения

р1++ ;

содержимое p1 станет 2002, а не 2001! Каждый раз при увеличении p1 указатель будет указывать на следующее целое. Это справедливо и для уменьшения. Например: р1 --; приведет к тому, что p1 получит значение 1998, если считать, что раньше было 2000.

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

Пример:

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

int i;

ptr1=a+4;

ptr2=a+9;

i=ptr1-ptr2;

i=ptr2-ptr1;

23. Операции динамического распределения памяти. Примеры .

Динамическое выделение памяти необходимо для эффективного использования памяти компьютера. Например, мы написали какую-то программку, которая обрабатывает массив. При написании данной программы необходимо было объявить массив, то есть задать ему фиксированный размер (к примеру, от 0 до 100 элементов).

В С++ работать с динамической памятью можно при помощи соответствующих функций распределения памяти new и delete.

new - для выделения памяти.

delete - для освобождения памяти.

Операция new создает объект заданного типа, выделяет ему память и возвращает указатель правильного типа на данный участок памяти. Если память невозможно выделить, например, в случае отсутствия свободных участков, то возвращается нулевой указатель, то есть указатель вернет значение 0. Выделение памяти возможно под любой тип данных: intfloat,double, char и т. д.

Пример:

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int main(int argc, char* argv[])

{

 int *ptrvalue = new int;

 *ptrvalue = 9;

 //int *ptrvalue = new int (9);

 cout << "ptrvalue = " << *ptrvalue << endl;

 delete ptrvalue;

 system("pause");

return 0;

}

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

В С++ существует связь между указателями и массивами, и связь эта настолько тесная, что эти средства лучше рассматривать вместе. Любой доступ к элементу массива, осуществляемый операцией индексирования, может быть выполнен с помощью указателя.

Между именем массива и указателем, выступающим в роли имени массива, существует одно различие. Указатель - это переменная, поэтому можно написать pa=a или pa++. Но имя массива не является переменной, и записи вроде a=pa или a++ не допускаются.

Пример:

/* strlen: возвращает длину строки */

int strlen(char *s)

{

int n;

for (n = 0; *s != '\0'; s++)

n++;

return n;

}

Чаще всего операции new и delete применяются для создания динамических массивов, а не для создания динамических переменных. После того как динамический массив стал ненужным, нужно освободить участок памяти, который под него выделялся. После оператора delete ставятся квадратные скобочки, которые говорят о том, что высвобождается участок памяти, отводимый под одномерный массив. Разработаем программу, в которой создадим одномерный динамический массив, заполненный случайными числами. По завершению работы с массивом, он удаляется, таким образом, высвобождается память, отводимая под его хранение.

Пример:

#include <iostream>

#include <ctime>

#include <iomanip>

using namespace std;

 

int main(int argc, char* argv[])

{

    srand(time(0));

    float *ptrarray = new float [10];

        for (int count = 0; count < 10; count++)

            ptrarray[count] = (rand() % 10 + 1) / float((rand() % 10 + 1));

        cout << "array = ";

        for (int count = 0; count < 10; count++)

            cout << setprecision(2) << ptrarray[count] << "    ";

        delete [] ptrarray;

        cout << endl;

    system("pause");

    return 0;

}

Соседние файлы в предмете Программирование