Общая форма объявления структуры
П-1
П-2
Ьш,
Массивы указателей
Свободным называется двухмерный массив (матрица), размер строк которого может быть различным. Преимущество использования свободного массива заключается в том, что не требуется отводить память ЭВМ с запасом для размещения строк максимальной возможной длины. Фактически, свободный массив представляет собой одномерный массив указателей на одномерные массивы данных.
Рассмотрим вначале как можно разместить в оперативной памяти матрицу со строками одинаковой длины.Чтобы создать в памяти ЭВМ двухмерный массив необходимо: 1) выделить блок оперативной памяти под массив указателей, 2) выделить блоки оперативной памяти под строки матрицы — одномерные массивы и 3) записать адреса строк в массив указателей. Графическое представление такой структуры хранения информации представлено на рис. 1.8. Обращение к элементу массива будет осуществлятся следующим образом:
где / — номер строки;7 — номер столбца.
МАССИВ
УКАЗАТЕЛЕЙ
*Ь[п]
ХРАНЕНИЕ
АДРЕСОВ
СТРОК
Строка 0 | ||||||
■ т ш | m-1 | |||||
Строка 1 | ||||||
■ ■ ■ | m-1 | |||||
^ьц][1] обращение к | ||||||
■ ш ш | элементу массива Строка п-2 | |||||
п-2 | ||||||
■ ■ ■ | m-1 | |||||
Строка п-1 | ||||||
п-1 | ||||||
1 | ... | m-1 | ||||
m - количество столбцов
n - количество строи
Рис. 1.8
Фрагмент программы реализации двухмерного массива со строками одинаковой длины показан ниже.
#include <alloc.h> #include <stdio.h> main()
float **b;
int n, m, i, j ;
printf ("\n Введите количество строк: п="); scanf ("%d", &n);
printf ("\n Введите количество столбцов: m="); scanf ("%d", &m);
b=(float**)malloc( n*sizeof(float*) ); /*Выделяется блок оперативной памяти */ /*для хранения адресов строк матрицы.*/ /* Используется двойная косвенная адресация.*/
for(i=0; i<=n-l; i++)
*/ Ь.*/ |
b[i]=(float*)malloc( n*sizeof(float) ); /*B цикле динамически выделяются блоки*/ /*оперативной памяти под строки. Адреса /*строк записываются в массив указателей
for(i=0; i<=n-l; i++) for(j=0; j<=m-l; j++)
{
printf ("\n введите элемент b[%d][%d]=",
i + 1, j+1);
scanf ("%f", &b[i][j] ) ; }
for(i=0; i<=n-l; i++) for(j=0; j<=m-l; j++) {
b[i] [j]= /* обработка массива */
}
}
Для размещения в оперативной памяти матрицы со строками разной длины необходимо ввести дополнительный массив т, в котором будут храниться
размеры строк. Фрагмент программы, в которой реализуется динамическое размещение такой матрицы приведен ниже [12].
#include <stdio.h> #include <alloc.h> main()
{
float **b; int i, j, n; int *m;
printf("\n Введите количество строк: п= "); scant("%u", &n);
b=(float **)malloc( n*sizeof(float*) ); m=(int *)malloc( n*sizeof(int) );
for(i=0; i<=n-l; i++)
{
printf("\n Введите длину строки: m[%u]=", i+1);
scant("%u", m+i) }
for(i=0; i<=n-l; i++)
b [i] = (float*)malloc( m[i]*sizeof(float) );
for(i=0; i<=n-l; i++) for(j=0; j<=m[i]-l; j++)
{
ii |
printf("\n Введите элемент b[%u][%u]
i+1, i+1);
scant("%f", &b[i][j]); }
for(i=0; i<=n-l; i++) for(j=0; j<=m[i]-l; j++) {
b[i] [j]= . . . }
Графическое представление двухмерного массива со строками разной длины представлено на рис. 1.9.
МАССИВ
УКАЗАТЕЛЕЙ
*Ь[п]
ХРАНЕНИЕ
АДРЕСОВ
СТРОК
О
Строка О
Т |
Строка
т[1]-1
Строка 2
т[2]-1
Строка п-2
т[п-2]
С т р ока п-1
т[0]-1
т[п] - массив для хранения размеров строк
л - количество строк
т[п-1]
Рис. 1.9 §1.23. Структуры
Структура — это объединение одного или нескольких объектов, возможно различного типа, под одним именем, которое является типом структуры. В качестве объектов могут выступать переменные, массивы, указатели и другие структуры.
Структуры позволяют трактовать группу связанных между собой объектов не как множество отдельных элементов, а как единое целое.
Пример — строка платёжной ведомости, которая содержит следующие сведения о работнике: полное имя, адрес, зарплату и так далее.
Таким образом, структура — сложный тип данных, составленный из простых типов.
struct | тип структуры | ||
{ | |||
тип | имя элемента | 1; | |
тип | имя элемента | 2; | |
тип | п | имя элемента | п; |
}; |
После закрывающей фигурной скобки « } » в объявлении структуры обязательно ставится точка с запятой.