Динамическая память. Лекция 1

Содержание

Слайд 2

Размерности 1 байт = 8 бит 1 параграф = 24 байт

Размерности

1 байт = 8 бит
1 параграф = 24 байт
1 Кб =

210 байт
1 Мб = 220 байт
1 сегмент = 64 Кб = 216 байт
Слайд 3

Модель оперативной памяти ПК Сегмент Смещение адрес = (сегмент, смещение) Абсолютный

Модель оперативной памяти ПК

Сегмент

Смещение

адрес = (сегмент, смещение)
Абсолютный адрес =
сегмент *16

+ смещение

Пример
Адрес = (F10A, 240E)
Абс. адрес = F10A0 + 240E

+

Слайд 4

Модель карты памяти

Модель карты памяти

Слайд 5

Сравнение статической и динамической памяти

Сравнение статической и динамической памяти

Слайд 6

Указатель Указатель – это переменная, значением которой является адрес области памяти Указатель Адрес Переменная Значение

Указатель

Указатель – это переменная, значением которой является адрес области памяти

Указатель

Адрес

Переменная

Значение

Слайд 7

Описание указателей На Паскале var p : pointer; t : ^integer;

Описание указателей

На Паскале

var
p : pointer;
t : ^integer;
n: integer;

n := t^;

На Си


int *t;
int n;

n = *t; //разыменование
t = &n; //адрес
Слайд 8

Указатели и массивы int b[5] = {1, 1}; int *p, i;

Указатели и массивы

int b[5] = {1, 1};
int *p, i;
for (i

= 2; i < 5; i++)
b[i] = b[i-1]+b[i-2];
//-----------------
for (p = b+2; p != b+5; p++)
*p = *(p-1) + *(p-2);

b

p

Слайд 9

Строки в Си #include … char S[100]; int l; strcpy (S,

Строки в Си

#include

char S[100];
int l;
strcpy (S, ”test”);
l = strlen(S);

S

l

4
Слайд 10

Функции работы с динамической памятью

Функции работы с динамической памятью

Слайд 11

Пример работы с динамической памятью #include #include int main() { float

Пример работы с динамической памятью

#include
#include
int main() {
float *t;
int i,

n;
printf(”\nn=”);
scanf(”%d”,&n);
t= (float *)malloc(n*sizeof(float));
for(i = 0; i < n; i++) {
printf (”x[%d]=”, i);
scanf(”%f”,&(t[i]));
}
for(i = 0; i < n; i++) {
if (i % 2 == 0) printf (”\n”);
printf(”\tx[%d]=%f”, i, t[i]);
}
free (t);
return 0;
}
Слайд 12

Пример 2 #include #include #include int main() { char *s, *s1;

Пример 2

#include
#include
#include
int main() {
char *s, *s1;
int n;
s =

(char *)malloc(100);
scanf(”%s”, s);
for(n = 0; s[n]; n++);
s1 = (char *)malloc(n*2 + 1);
strcpy(s1, s);
strcpy(s1 + n, s);
printf(”%s”, s1);
free(s);
free(s1);
return 0;
}
Слайд 13

Пример 3. void swap (int *x, int *y) { int a;

Пример 3.

void swap (int *x, int *y)
{
int a;
a =

*x;
*x = *y;
*y = a;
}

int main()
{
int a, b;

swap(&a, &b); // обмен значений двух переменных

return 0;
}
Слайд 14

Структуры в Си это объединенные данные. В отличие от массивов, структуры

Структуры в Си

это объединенные данные. В отличие от массивов, структуры могут

содержать данные разных типов:
struct <имя типа> {<поля>}
struct student {
char *name;
int age;
};
struct student x, y, *z;

Слайд 15

Так же можно объявлять переменные сразу после объявления структуры: struct student

Так же можно объявлять переменные сразу после объявления структуры:
struct student {    char

name[20]; char sex;
    int age;
    float mark; } a, b[5], *c;
Слайд 16

Операции над структурами присваивание полю структуры значение того же типа; можно

Операции над структурами

присваивание полю структуры значение того же типа;
можно получить

адрес структуры. Не забываем операцию взятия адреса (&);
можно обращаться к любому полю структуры, доступ к полям структуры производится по имени поля; (x = a.mark; x=c->mark;)
для того, что бы определить размер структуры, как и любого другого типа, можно использовать операцию sizeof().
Слайд 17

Инициализация структуры struct student a = {"Sergey", ‘m', 20, 4.5 };

Инициализация структуры

struct student a = {"Sergey", ‘m', 20, 4.5 };
Cоздается переменная

типа struct student и присваивается всем полям, которые у нас определенны в структуре, значения. Порядок очень важен при инициализации структуры. Если какое-либо поле у вас будет не заполненным, то оно автоматом заполнится 0 - для целочисленных типов;
NULL - для указателей; \0 - для строковых типов.
Структура того же самого типа не может содержаться в качестве поля - рекурсивные определения запрещены!
Но можно использовать поля - указатели на структуры такого же типа или другого (об этом позже).
Слайд 18

Пример: struct student { char name[20]; char sex; int age; float

Пример:
struct student {    char name[20]; char sex;
   int age;
    float mark;

};
struct student x, y, *z;
x.age = 19;
scanf (“%s”, x.name);
z = &x;
printf (“age = %d\n”, x.age);
printf (“age = %d\n”, (*z).age);
printf (“age = %d\n”, z->age);
Слайд 19

Объединения позволяют определять один и тот же участок памяти для хранения

Объединения

позволяют определять один и тот же участок памяти для
хранения нескольких типов

данных. При этом память – для
максимального типа.
Это тип данных, который очень похож на структуру. Только
все данные объединения занимают одну и ту же область в
памяти.
union rec {    int a;    float b;
struct student st;
} x,y,*a;
x.a = 5;
x.st.age = 19;