Free(ma); освобождение памяти
// delete[]ma; //для операцииnew – delete
return -1;} }
puts("Введите элементы массива");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&ma[i][j]);
printf("массив:”);
for(i=0;i<M;i++)
{for(j=0;j<N;j++)
{if(*(*(ma+i)+j)<0) *(*(ma+i)+j)=0;
printf("%d",ma[i][j]);}
printf("\n”); }
for(i=0;i<M;i++)
free(ma[i]);
// delete [] ma[i];//для операцииnew – delete
Free(ma);
// delete []ma;//для операцииnew – delete
}
В этом примере вначале создается массив из M указателей типа int*, а затем для каждого из них запрашивается память, равная длине строки N. Проверка выделения памяти выполняется после каждого вызова функции malloc()(или операцииnew),если память для массива указателей выделилась, а для какой то из строк нет, то память для массива указателей все равно необходимо высвободить. В конце программы показано как следует высвобождать память. В конце с помощью цикла высвобождается память для каждой из строк массива, а затем память, выделенная для массива указателей на эти строки.
Структуры и объединения
8.1 Структуры
Структуры ‑ это совокупность поименованных объектов в общем случае разных типов. Каждая структура включает в себя один или несколько объектов (переменных, массивов, указателей, структур), называемых элементами структуры.
Структурный тип (шаблон) определяет, сколько элементов и какого типа входят в структуру. Определение шаблона структуры начинается со служебного слова struct, за которым помещаются описания входящих в структуру элементов, заключенные в фигурные скобки. Под шаблон память не выделяется.
Синтаксис определения шаблона структуры следующий:
struct имя_структурного_типа{type_1 элемент_1;
Type_2 элемент_2;
. . . . . . ;
Type_n элемент_n;
};
После определения структурного типа с его помощью можно определить конкретные структуры следующим образом:
имя_структурного_типа имя_структуры;Например:
struct STR {char c;
Float f;
short a[3];
};
STR rec1, rec2, rec3[2];
Здесь определен структурный тип STR с элементами char c, float f, short a[3] и определены структуры: rec1 и rec2, а также массив из 2-х структур rec3. Каждая из определенных структур rec1, rec2, rec3 содержит в качестве элементов свои собственные данные, состав которых определяется структурным типом с именемSTR.
Для доступа (обращения) к элементам структуры используются уточненные имена. Используется следующая конструкция языка: имя_структуры.имя_элемента_структуры.
Например:
rec1.c='z'; rec1.f=3.2;
rec1.a[0]=1; rec2.ch='w';
rec2.f=4.5; rec2.a[1]=10;
rec3[0].c='d'; rec3[0].f=1.8;
rec3[0].a[0]=100; rec3[0].a[1]=200;
rec3[0].a[2]=300;
rec3[1].c='t'; rec3[1].f=2.9;
rec3[1].a[0]=400; rec3[1].a[1]=500;
rec3[1].a[2]=600;
Допустимо определять структуры вместе с определением структурного типа. Например:
struct ABC{int a1;float a2;long a3;}str1, str2;
Структурный тип можно ввести с помощью служебного слова typedef:
typedef struct RR {char ch;int b;}my_RR;
В этом случае имена структурyго типа RRиmy_RRназывают соответственно первичным и вторичным, и они совершенно равноправны.
RR a1;
My_RR a2;
Любое из этих имен может отсутствовать в определении
typedef struct R1 {char ch; int b;};
typedef struct {char ch; int b;} R2;
R1 a3; R2 a4;
Выделение памяти под структурную переменную осуществляется по шаблону. Например, для структур rec1, rec2распределение памяти следующее:
1 байт | 2 байт | 3 байт | 4 байт | 5 байт | 6 байт | 7 байт | 8 байт | 9 байт | 10 байт | 11 байт |
c | f | a[0] | a[1] | a[2] |
Например, для структур rec3распределение памяти следующее:
c | f | a[0] | a[1] | a[2] | c | f | a[0] | a[1] | a[2] |
Размер структуры можно определить с помощью операции sizeof().
int n1=sizeof(rec1); // 11 байт
int n2=sizeof(STR); // 11 байт
int n3=sizeof(rec3); // 22 байта
При определении структуры возможна её инициализация, т.е. присвоение начальных значений элементам структуры. После определения структуры ставится знак = и далее в фигурных скобках через запятую задаются значения элементов структуры согласно структурному типу. Инициализация бывает полная и неполная:
struct STR{ char ch; float f; short a[3];};
STR r1={'a',1.1,1,2,3}; //полная
STR r2={'с',2.1}; //неполная
STR r3[2]={{'w',6.6,10,20,30},{'v',7.7,40,50,60}};
Структурный тип можно ввести с помощью служебного слова typedef:
typedef struct RR{char ch;int b;}my_RR;
При этом RRиmy_RR– равноправные первичное и вторичное имена структурного типа. Для определения структур можно использовать любое из имен. Например, определены две одинаковые структурыa1, a2.
RR a1;
My_RR a2;
Можно определять указатели на структуру. Если определен указатель структурного типа, то память выделяется только под указатель (4 байта). Поэтому необходимо указатель на структуру проинициализировать адресом (или присвоить адрес) раннее определенной структурой этого же типа.
STR *pst1=&rec2,*pst2;
pst2=&rec2;
После такого определения доступ к элементам структуры выполняется через разыменование указателя или с помощью операции ->.
(*pts1).f=8.8;
(*pts2).a[0]=100;
pts2->f=9.9;
pts1->a[0]=1000;
Можно создавать и уничтожать динамические структуры.
Синтаксис определения динамической структуры с помощью функций malloc() и free()следующий:
struct имя_шаблона{…}; // определение структурного типа
имя_шаблона *имя_структуры; //определение указателя на структуру
//Запрос памяти под структуру
имя_струк1=(имя_шаблона*)malloc(N*sizeof(имя_шаблона));
if(имя_струк1==NULL) // проверка выделения памяти
{puts("Ошибка выделения памяти"); return -1;}
//Программа...
free(имя_струк1); //освобождение памяти
Синтаксис определения массива динамических структур с помощью функций malloc() и free()следующий:
int N; scanf("%d",&N); // ввод количества структур
имя_шаблона *имя_струк2; //определение указателя на структуру
//Запрос памяти под массив структур
имя_струк2=(имя_шаблона*)malloc(N*sizeof(имя_шаблона));
if(имя_струк2==NULL) // проверка выделения памяти
{puts("Ошибка выделения памяти"); return -1;}
//Программа...
free(имя_струк2); //освобождение памяти
При работе с операциями newиdeleteопределение динамических структур аналогично, отличаются запрос и освобождение памяти:
//Запрос памяти для одной структуры
имя_струк1=new имя_шаблона;
...
delete имя_струк1; //освобождение памяти одной структуры
//Запрос памяти для массива структур
имя_струк2=new имя_шаблона[N];
...
delete[]имя_струк2;//освобождение памяти массива структур
Пример. Создать одну динамическую структуру согласно заданного структурного типа и присвоить значения элементам.
#include <stdio.h>
Int main()
{struct STD{char name[20]; float rating;};
STD *st; // определение указателя
st=(STD*)malloc(sizeof(STD)); //Запрос памяти
//st=new STD; //Запрос памяти
if(st==NULL) // проверка выделения памяти
{puts("Ошибка выделения памяти");return -1;}
gets(st->name);//ввод имени
st->rating=4.5; //присвоение значения
printf("%s\n%.2f\n",st->name, st->rating);
free(st); //освобождение памяти
// delete st; //освобождение памяти
return 0;}
Пример.Создать массив динамических структур согласно заданному шаблону и ввести с клавиатуры значения элементов.
#include <stdio.h>
struct MYSTR{char name[20]; int age;};
Int main()
{MYSTR *b; int N;
puts("Ведите размер массива");
scanf("%d",&N);
b=(MYSTR*)malloc(N*sizeof(MYSTR); //Запрос памяти
//b=new MYSTR[N]; //Запрос памяти
if(b==NULL) // проверка выделения памяти
{puts("Ошибка выделения памяти"); return -1;}
for(int i=0;i<N;i++)
scanf("%s %d",b[i].name, &b[i].age);
for(i=0;i<N;i++)
printf("%s\n%d\n",b[i].name,b[i].age);
free(b); //освобождение памяти
//delete [] b; //освобождение памяти
return 0;}
8.2 Объединения
Объединение – это совокупность объектов различных типов, все члены которой начинаются с одного адреса. Тип объединения (шаблон) определяет, сколько элементов и какого типа входят в него. Определение типа объединения начинается со слова union, за которым помещаются описания элементов, заключенные в фигурные скобки.
Если в структуре все элементы расположены последовательно, то объединение совмещает элементы несколько различных типов. При этом под объединение выделяется память, равная размеру максимального элемента объединения.
Для определения объединения сначала определяется тип объединения, а затем само объединение:
union имя_типа_объединения {type_1 элемент_1;
Type_2 элемент_2;
. . . . . . ;
type_n элемент_n;};
Дата добавления: 2016-04-11; просмотров: 1189;