Содержание
- 2. Оперативная память (ОП) ПЭВМ состоит из ячеек размером в 1 байт, каждая ячейка имеет собственный уникальный
- 3. Для кода программы, данных и переменных, тип которых описан в программе, компилятор выделяет в оперативной памяти
- 4. Замечания к карте оперативной памяти для программ на С в MS DOS Адресация и распределение памяти
- 5. УКАЗАТЕЛЬ – это переменная, значением которой является адрес какого-то объекта в памяти компьютера (обычно, другой переменной).
- 6. Получение адреса – & – значение адреса операнда в памяти. Например: n = &p1; Разыменование (разадресация,
- 7. Операции с указателями Арифметические операции (адресная арифметика) – суммирование и вычитание – учитывают размер типа величины
- 8. ПРИМЕР #include void main () { int *a, b; *a=100; b=200' cout } Результат: a=0x034c, *a=100,
- 9. Динамические переменные Указатели в C\C++ используются при создании и обработке динамических объектов. Память для них называется
- 10. Динамические переменные Для выделения памяти указателю в С++ используются функции: new ; ‒ возвращает указатель на
- 12. Скачать презентацию
Оперативная память (ОП) ПЭВМ состоит из ячеек размером в 1 байт,
Оперативная память (ОП) ПЭВМ состоит из ячеек размером в 1 байт,
Адрес каждого байта ОП формируется из двух слов (каждое размером по 16 бит – по 2 байта) – адреса сегмента и смещения (смещение указывает на сколько байт от начала сегмента сдвинут адрес конкретного байта).
Адрес байта формируется следующим образом: адрес сегмента смещается на 4-е двоичных разряда (бита) влево и к нему прибавляется смещение, таком образом физический адрес байта составляет 20 бит и с его помощью можно адресовать 220 байт (1 Мбайт):
Сегмент
+
Смещение
=
Адрес
16+4 бит
16 бит
20 бит
Адрес сегмента
Смещение
Физический адрес
Указатель занимает в памяти 4 байта (32 бита) и адресует первый байт данных, например, первый байт первого элемента массива.
Указатель занимает в памяти 4 байта (32 бита) хотя собственная длина указателя – 20 бит и он помещается в 3 байта, НО обычно память выделяется словами по 2 байта (16 бит) и выравнивается на границу слова – т.е под указатель выделяется 2 слова (а не 1,5).
И+ПРГ
И+ПРГ
Для кода программы, данных и переменных, тип которых описан в программе,
Для кода программы, данных и переменных, тип которых описан в программе,
И+ПРГ
Карта оперативной памяти программ на С/С++ в MS DOS
Замечания к карте оперативной памяти для программ на С в MS
Замечания к карте оперативной памяти для программ на С в MS
Адресация и распределение памяти для программ
И+ПРГ
Откомпилированная С-программа создает и использует 4 логически разделенных области памяти, имеющих свое назначение.
Первая область ‒ это память, содержащая код программы. Код главной программы размещается в кодовом сегменте (Cseg). Размер кодового сегмента не может превышать 64К.
Следующая область предназначена для хранения глобальных переменных. Сегмент данных (адресуемый через DSeg) содержит все глобальные переменные. Регистр DS никогда не изменяется во время выполнения программы. Размер сегмента данных не может превышать 64К.
Область Стека используется для самых различных целей при выполнении программы. Он содержит адреса возвратов вызываемых функций, аргументы, передаваемые в функции, и локальные переменные. Он также используется для хранения текущего состояния процессора. При запуске программы регистр сегмента стека (SSeg) указывает на первый байт после сегмента стекаРазмер стекового сегмента не может превышать 64К; размер по умолчанию - 16К, он может быть изменен директивой компилятора.
Область Кучи ‒ это область свободной памяти, которую программа может использовать для динамического выделения памяти.
Префикс сегмента программы (Program Segment Prefix - PSP) -это 256-ти байтовая область, создаваемая DOS при загрузке программы.
УКАЗАТЕЛЬ – это переменная, значением которой является адрес какого-то объекта в
УКАЗАТЕЛЬ – это переменная, значением которой является адрес какого-то объекта в
Указатель в С не является отдельным типом данных, он всегда связан с каким-либо конкретным типом.
В С / С++ различают три вида указателей:
на объект, на функцию и на void.
Объявление указателя на объект:
<тип> * <имя>;
Например: int *a, *c;
Объявление указателя на void – применяется когда конкретный тип объекта, адрес которого требуется хранить, не определен:
Например: extern void *malloc(int);
Объявление указателя на функцию:
<тип> (*<имя>) (<список_типов_аргументов>);
Например: int (*fun) (double, double);
Примеры:
int *pi; // Указатель на целую переменную
const int *pci; // Указатель на целую константу
int * const cp=&i; // Указатель-константа на переменную
const int *const cpc=&ci; // Указатель-константа на целую константу
И+ПРГ
Получение адреса – &<имя_переменной> – значение адреса операнда <имя> в
Получение адреса – &<имя_переменной> – значение адреса операнда <имя> в
Разыменование (разадресация, раскрытие ссылки) – *<имя_указателя> – значение объекта, адрес которого <имя_указателя>. Например: z = *n;
Присваивание –
<имя_указателя1> = <имя_указателя2> -
если оба операнда имеют один тип – простое присваивание, иначе – присваивание с преобразованием типа указателя – это:
Приведение типов – два вида – с указателем типа void* и без его использования.
void* в С разрешает неявное преобразование (в С++ – только явное, даже для void*). Преобразования всех остальных типов указателей должны быть явными, т.е. должна быть указана операция приведения типов.
Например: если x – имеет тип int, а *p – double, то надо записывать p = (double *) &x.
Использовать приведение надо осторожно и обязательно к базовому типу указателя, а не объекта.
Операции с указателями
И+ПРГ
Операции с указателями
Арифметические операции (адресная арифметика) – суммирование и вычитание
Операции с указателями
Арифметические операции (адресная арифметика) – суммирование и вычитание
сложение (вычитание) с константой – p1 = p1 + 12; p2 = p2 – 5;
увеличение (инкремент) – p1++; – при увеличении на 1 указатель p1 будет смещаться на величину типа данных и указывать на следующее значение.
Например:
в типе int* – смещение на 2 байта – p1=200, p1++ = 202, p1-- = 198.
уменьшение (декремент) – p1--; – аналогично инкременту.
вычитание двух указателей – разность двух указателей – это разность их значений, деленная на размер типа в байтах. Так можно определять количество объектов (например, элементов массива) между адресами указателей.
Например:
в массиве разность указателей на 3-й и 6-й элементы равна 3.
Сравнение - допустимы любые операции сравнения, обычно, они имеют смысл, когда ссылки на общий объект.
И+ПРГ
ПРИМЕР
#include
void main ()
{
int *a, b;
*a=100; b=200'
cout<<"\na="<b=200
В языке С/C++ с указателями допустимы практически все операции.
И+ПРГ
ПРИМЕР
#include В языке С/C++ с указателями допустимы практически все операции. И+ПРГ
void main ()
{
int *a, b;
*a=100; b=200'
cout<<"\na="<b=200
Динамические переменные
Указатели в C\C++ используются при создании и обработке динамических объектов.
Динамические переменные
Указатели в C\C++ используются при создании и обработке динамических объектов.
Динамические объекты, в отличие от заранее определяемых, создаются и уничтожаются динамически и явно в процессе выполнения программы. Динамические объекты не имеют имен, и ссылка на них выполняется с помощью указателей.
При завершении программы используемая её динамическая память автоматически освобождается.
Для выделения памяти указателю в С используются функции из stdlib.h:
malloc (size); ‒ возвращает указатель на выделенный блок памяти размером size байт.
сalloc (num, size); ‒ возвращает указатель на первый байт выделенного блока памяти размером num элементов каждый по size байт (все элементы инициализируются нулями).
Если память не выделена значение возвращаемого указателя NULL.
Для изменения выделенной памяти исп.:
realloc (prt, size); ‒ получает блок памяти (указатель prt), изменяет его размер до size (больший или меньший прежнего) и возвращает указатель на новое положение блока памяти (другое, если блок пришлось переместить). Ранее размещенные данные сохраняются. Если не удается увеличить блок, то возвращается NULL, а значение prt остается доступным.
Для освобождения памяти используется:
free (prt); ‒ где prt – имя указателя, адресующего блок памяти.
Примеры:
int* n = (int*) malloc (sizeof(int));
float *p; p = calloc (100, sizeof(float));
char* p; p = realloc (p, 18);
И+ПРГ
Динамические переменные
Для выделения памяти указателю в С++ используются функции:
new <тип_данных>;
Динамические переменные
Для выделения памяти указателю в С++ используются функции:
new <тип_данных>;
Для освобождения памяти используется:
delete prt; - где prt – имя указателя, адресующего освобождаемый блок памяти.
Примеры:
int* n = new int;
int* o = new int (12); - начальное значение
delete n; delete o;
int* kl = new int [12]; - указатель на массив
delete [] kl; (без [] освободит первый элемент массива, а остальные станут недоступны, но заняты - мусор).
Указатель на массив
Указатель на массив хранит адрес его первого байта. Имя массива без индексов – это его адрес. Пример: char str[50], *pl;
pl = str;
str[4] и *(pl+4) - эквивалентны
Массивы указателей
Как и объекты любых других типов, указатели могут быть собраны в массив.
Пример: int *x[20];
x[2] = &va – присвоение адреса переменной va третьему элементу массива указателей x.
Указатель на функцию
Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции. Имя функции без скобок и аргументов – это адрес точки входа в неё. Вид указателя на функцию:
<тип> (*<имя>) (<список_типов_аргументов>)
Пример: int (*p) (const char *, const char);
И+ПРГ