Общая форма объявления структуры

П-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;
тип п имя элемента п;
};      

После закрывающей фигурной скобки « } » в объявлении структуры обязательно ставится точка с запятой.