- •Московский государственный институт пищевой промышленности
- •Type * имя указателя;
- •Int **p7; //неинициализированный указатель на объект типа int * // р7 – указатель на указатель
- •1.2. Типы указателей и операции над ними
- •Операция разыменования
- •Операция преобразования типов
- •Операция присваивания
- •Операция получения адреса указателя
- •Операция сложения и вычитания
- •Операции отношений (операции сравнений)
- •1.3. Массивы Массивы и переменные с индексами
- •Int z[100]; // одномерный массив из 100 элементов типа int char s[80]; // одномерный массив из 80 элементов типа char (строка) float y[3][4];// двумерный массив из 12 элементов типа float
- •Задача – 1
- •Математическая постановка задачи
- •Задача – 2
- •Математическая постановка задачи
- •Инициализация массивов
- •Массивы и указатели
- •Динамические массивы
- •2. Функции, передача параметров
- •2.1.Определение функции
- •Void Sum(float *s,float *X, int n); //прототип функции Sum
Динамические массивы
Динамическими называют такие массивы, для которых количество их элементов заранее не известнои оперативная память для них выделяется в процессе выполнения программы.Рассмотрим построение динамических массивов в Си++ с помощью указателей и оператораnew. Ниже приводится пример программы, реализующей создание двух динамических массивов целых чисел: одномерного массива с числом элементов, равных К (вводится с клавиатуры) и двумерного массива с числом строкNи числом столбцовM(также вводятся с клавиатуры). Первый массив создается с помощью указателяp, второй – с помощью указателяp2. Указательp2 является указателем на указатель типаint( в соответствии с объявлениемint **p2;).
#include<stdio.h>
#include<conio.h>bv
void main ()
{
int *p;
int **p2;
int i,j,K,N,M;
clrscr();
printf("***array1 ***\n");
printf("K = ");
scanf("%d", &K);
p = new int[K];
for (i=0; i<K; i++)
{
p[i] = i+3;
printf("%d ",p[i]);
}
printf("\n***array2 ***\n");
printf("N = ");
scanf("%d",&N);
printf("M = ");
scanf("%d",&M);
p2 = new int * [N];
for (i=0;i<N;i++)
{ p2[i] = new int[M];
for (j=0;j<M;j++)
{ p2[i][j] = i + j;
printf("%d ", p2[i][j]);
}
printf("\n");
}
getch();
}
В результате выполнения этой программы при К = 6, N= 3и M= 4 на экране получим следующую информацию:
***array1
***
К = 6 3 4 5 6 7 8 ***array2 *** N = 3 M = 4 0 1 2 3 1 2 3 4 2 3 4 5
Рис.5. иллюстрирует процесс создания двух динамических массивов. Для создания двумерного массива вначале выделяется свободное место в памяти компьютера для массива указателей на intиопределяется значение (оператор p2 =newint* [N];,а непосредственно после выполнения этого оператора значение p2равно адресу нулевого участка выделенной памяти). Затем выделяется свободное место для каждой строки матрицы и определяется значение каждого i -го указателя на int (оператор p2[i] =newint[M];, а непосредственно после выполнения этого оператора значение p2[i] равно адресу нулевого участка, выделенной для p2[i]области). На рис.5. показано состояние указателей непосредственно после выполнения операторов new, в этот момент значения выделенных участков еще не определены.
В
заключение раздела отметим следующее:
Указатели – это, такие объекты программы, значения которых являются адреса других объектов, в том числе и самих указателей. Описание указателей для элементарных данных осуществляется с указанием типа объектов, на которые может указывать указатель: int*p1;//–указатель на объект типа intfloat*p2;// -указатель на объект типа floatfloat**p3;// -указатель на указатель на объект типа float void*p4;// -указатель на объект без информации о типе указываемого объекта
Для указателей применяются операции: разыменования, преобразования типа, присваивания, получения адреса, сложения и вычитания, инкремента и декремента, отношений.
Массивы – это объекты программы, состоящие из однотипных элементов, которые располагаются в оперативной памяти на соседних участках. Число индексов и диапазоны их значений должны быть заранее известны (эта информация указывается при объявлении массива). Примеры объявлений: intf[10];//одномерный массив f из 10 элементов типа int, индекс может иметь // значения от 0 до 9 chars[15];// одномерный массив s из 10 элементов типа char, индекс может иметь // значения от 0 до 14 double V[3][4];//двумерный массив V из 3 строк и 4 столбцов, первый индекс может принимать значения от 0 до 2, второй – от 0 до 3; каждый элемент массива типа doublе.
Транслятор языка Си воспринимает только одномерные массивы. Однако элементами одномерного массива в свою очередь могут быть одномерные массивы, поэтому двумерные массивы – это массивы массивов, трехмерные – массивы массивов, у которых, опять же, элементами являются одномерные массивы, и т. д.
Обращение к элементам массива осуществляется с помощью переменных с индексами (f[i],s[5],V[i][k]) или с помощью указателей (*( p1 +i)или p1[i], *(p3[i] +j)или p3[i][j] ). При обращении с помощью указателей должны быть выделены участки памяти для размещения соответствующих массивов с помощью оператора new.
С помощью указателей возможно реализовать динамические массивы (массивы с заранее неизвестной размерностью).
