Разделы презентаций


Использование динамической памяти Адресация оперативной памяти

Содержание

5.2 Указатели и операции над ними[][][] [И2]*[=]; Где : - признак изменчивости содержимого по адресу указателя. Задается ключевым словом const. При этом значение содержимого памяти, которую адресует указатель, нельзя менять. Может

Слайды и текст этой презентации

Слайд 1Глава 5. Использование динамической памяти 5.1 Адресация оперативной памяти.
Минимальная адресуемая единица

памяти – байт.



Физический адрес Аф – номер байта оперативной памяти.
Адресация

по схеме «база+смещение»:
Аф = Аб + Асм,
где Аб – адрес базы – адрес, относительно которого считают
остальные адреса;
Асм – смещение – расстояние от базового адреса до физического.
Указатель – тип данных, используемый для хранения смещений.
В памяти занимает 4 байта, адресует сегмент размером V = 232 = 4 Гб.
Базовый адрес = адрес сегмента.

0

1

2

3

4



Aсм

Аф

Глава 5. Использование динамической памяти 5.1 Адресация оперативной памяти.Минимальная адресуемая единица памяти – байт.Физический адрес Аф –

Слайд 25.2 Указатели и операции над ними
[][][] [И2]*[=];

Где

:
- признак изменчивости содержимого по адресу указателя. Задается ключевым

словом const. При этом значение содержимого памяти, которую адресует указатель, нельзя менять. Может отсутствовать.
<И2> - признак изменчивости указателя. Задается ключевым словом const. При этом значение самого указателя нельзя менять.
Может отсутствовать.
<Тип данных> - тип данных, адресуемых указателем. Любой тип, определенный в С++, в том числе void.
<Тип > - тип указателя. Определяется моделью памяти. Может быть far или near. Если тип указателя не указан, принимается near.
5.2 Указатели и операции над ними[][][] [И2]*[=]; Где : - признак изменчивости содержимого по адресу указателя. Задается

Слайд 3Примеры определения указателей

1) short a, *ptrs =&a;


2) const short

*ptrs;



3) short *const ptrs=&a;

Неизменяемое значение:
можно ptrs = &b;

нельзя *ptrs=10;

Неизменяемый указатель
можно *ptrs=10; нельзя ptrs = &b;



Указатель можно инициализировать адресом реальной переменной

Примеры определения указателей 1) short a, *ptrs =&a;2) const short *ptrs; 3) short *const ptrs=&a; Неизменяемое значение:можно

Слайд 45.2.1 Типизированные и нетипизированные указатели
Различают указатели:
типизированные – адресующие данные

конкретного типа;
нетипизированные – не связанные с данными определенного типа.
Объявление типизированного

указателя:
int *b,*c ;
float *s ,double *f;
long double *l;
Объявление нетипизированного указателя:
void * <имя>;
Этот указатель создан как бы «на все случаи жизни».
Он отличается от других отсутствием сведений о размере соответствующего участка памяти. Поэтому его легко связывать с указателями других типов.


Все указатели несут в себе сведения о размере памяти, адресуемой этим указателем

5.2.1 Типизированные и нетипизированные указателиРазличают указатели: типизированные – адресующие данные конкретного типа;нетипизированные – не связанные с данными

Слайд 5Нулевой указатель
В С++ определена адресная константа NULL;
Эта константа определяет адрес,

который никуда не указывает или «нулевой указатель».
Его можно присвоить указателю

любого типа.
Например:
int *pi=NULL;
float *pf=NULL;
void *b=NULL;

Кроме того, эту константу можно использовать в операциях сравнения при проверке логических адресных выражениях.
while (pi!=NULL) do { …};

0

pi

pf

0

b

0

Нулевой указательВ С++ определена адресная константа NULL;Эта константа определяет адрес, который никуда не указывает или «нулевой указатель».Его

Слайд 65.2.2 Операции над указателями
Присваивание.
Допускается присваивать указателю значение другого указателя

того же типа или нулевого указателя.
Пример:
int *p1,*p2;
float *p3,*p4;
void

*p;...
{допустимые операции}
p1=p2; p4=p3; p1=NULL; p=NULL; ...
{недопустимые операции}
p3=p2; p1=p3;
Однако, при необходимости выполнить операцию присваивания, можно использовать явное переопределение типа, для приведения указателя одного типа к другому.
p3=(float*)p2;
p2=(int*)p3;
p1=(int*)p;

Явное переопределение типа указателя

5.2.2 Операции над указателямиПрисваивание. Допускается присваивать указателю значение другого указателя того же типа или нулевого указателя. Пример:int

Слайд 7Операции над указателями (2)
2. Получение адреса (&).
Результат операции –

адрес некоторой области памяти, который можно присвоить указателю.
Это можно сделать:
a)

При помощи операции присваивания:
int *pi,i=10;
... pi=&i;

b) Во время инициализации указателя при его определении:
float b=5.7;
float *pf=&b;


pi

10

i

b

5.7

pf


Операции над указателями (2)2. Получение адреса (&). Результат операции – адрес некоторой области памяти, который можно присвоить

Слайд 8Операции над указателями (3)
3. Доступ к данным по указателю (операция

разыменования). Полученное значение имеет тип, совпадающий с базовым типом данных

указателя.
Нетипизированные указатели разыменовывать нельзя.
Примеры:
short c, a=5,*ptri=&a; float d,p=2.4563;
void *b=&a;
1) c=*ptri;
*ptri=125;
При необходимости разыменовать нетипизированный указатель требуется выполнить явное преобразование типа.
3) *b=6; ⇒ *(int*)b=6;
4) b=&p;
d=*b => d=*(float *)b


b


5

a



5

b

a

6





b

p






Явное переопределение типа указателя


ptri



c

5

1

25

Операции над указателями (3)3. Доступ к данным по указателю (операция разыменования). Полученное значение имеет тип, совпадающий с

Слайд 9Операции над указателями (4)
4. Операции отношения:
проверка равенства (==) и

неравенства (!=).
Примеры:
int sign = (p1 == p2);
if (p1!=NULL) {….}


5.Арифметические операции.
В С++ над указателями разрешены операции:
- сложение и вычитание (аддитивные операции)
инкремент или автоувеличение (++)
декремент или автоуменьшение (--)
В силу особенностей выполнения арифметических операций над указателями, совокупность этих операций получила название Адресной арифметики

Операции над указателями (4)4. Операции отношения: проверка равенства (==) и неравенства (!=).Примеры: int sign = (p1 ==

Слайд 10 + n ⇔ + n*sizeof()

Пример:

short a, *ptrs =&a;
1) ptrs++;




2) ptrs+=4;





3) *(ptrs+2)=2;

5.2.3 Адресная арифметика

Значение
указателя
меняется

Значение
указателя
не меняется!!!

Значение
указателя
меняется

+ n ⇔ + n*sizeof()Пример:   short a, *ptrs =&a; 1)  ptrs++; 2)

Слайд 11Адресная арифметика (2)
Особенности результатов выполнения операций адресной арифметики связано с

реализацией языка С++.
В С++ принят обратный порядок размещения объектов в

памяти.
Это объясняется особенностями работы компилятора. При разборе текста, компилятор распознает и размещает в стек имена всех объектов, которые необходимо разместить в памяти.
На этапе распределения памяти имена объектов выбираются из стека и им отводятся смежные участки памяти. А так как порядок записи в стек обратен порядку чтения, размещение объектов оказывается обратным.
Например:
int i1=10,i2=20,i3=30;

10

20

30

направление увеличения адресов

i1

i2

i3


*&i2= ++*p=
*&++i2= *--p=
*p= ++*--p=
*p++ *(p-1)=

Адресная арифметика (2)Особенности результатов выполнения операций адресной арифметики связано с реализацией языка С++.В С++ принят обратный порядок

Слайд 12Адресная арифметика (3)
// Ex5_1.cpp
#include "stdafx.h"
#include
int main(int argc, char*

argv[])
{int i1=10,i2=20,i3=30;
int *p=&i2;
// Value and Address
// i1,i2,i3
cout

*&i1= " << *&i1;
cout <<"\n &i2="<<&i2;
cout << " *&i2= " << *&i2;
cout <<"\n &i3="<<&i3;
cout << " *&i3= " << *&i3;
// value i2 added 1 (+  1)
cout <<"\n *&i2="<<*&i2<cout<<"*&++i2"<<*&++i2<

// value i2
cout << " *p= " << *p<// value i2 for Ukaz p
//(p up for 1)
cout <<"\n *p++ ="<< *p++;
// Value i1
cout <<"\n *p ="<< *p;
// value i1 up for 1
cout << "\n++*p =" << ++*p;
//Value i2 begin with down p
cout << "\n*--p = " << *--p;
// Value i3 , begin down p,
// i3 up
cout <<"\n++*--p ="<< ++*--p;
cout< return 0;
}

Адресная арифметика (3)// Ex5_1.cpp #include

Слайд 13Соотношение ссылки и указателя
int a,
*ptri=&a, - указатель

&b=a; - ссылка

a=3; ⇔ *ptri=3;

⇔ b=3;

Основное отличие – для обращения к содержимому по указателю нужна операция разыменования,
обращение к содержимому по ссылке осуществляется по имени ссылки!!!
Соотношение ссылки и указателяint a,   *ptri=&a, - указатель   &b=a;   - ссылка

Слайд 145.3 Управление динамической памятью (С)
1. Размещение одного значения
Выделение памяти
void *

malloc(size_t size); - возвращает адрес начала области памяти; при присвоении

указателю – явное преобразование типа.
Освобождение памяти
void free(void *block);

Пример:
int *a;
if ((a = (int *) malloc(sizeof(int))) == NULL)
{ printf("Не хватает памяти для числа.");
exit(1); }
*a=-244; *a+=10;
free(a);
5.3 Управление динамической памятью (С)1. Размещение одного значенияВыделение памятиvoid * malloc(size_t size); - возвращает адрес начала области

Слайд 15Управление динамической памятью (С)
2. Размещение нескольких значений
Выделение памяти
void * сalloc(size_t

n, size_t size);
Освобождение памяти
void free(void *block);

Пример:

int *list;


list = (int *) calloc(3,sizeof(int));
*list=-244;
*(list+1)=15;
*(list+2)=-45;

free(list);
Управление динамической памятью (С)2. Размещение нескольких значенийВыделение памятиvoid * сalloc(size_t n, size_t size); Освобождение памятиvoid free(void *block);

Слайд 16Управление динамической памятью (С++)
1. Одно значение
Операция выделения памяти
=new[()];
Операция

освобождения памяти
delete ;

Примеры:
а) int *k;
k = new int;
*k

= 85;

б) int *a;
if ((a = new int(-244)) == NULL)
{printf("Не хватает памяти для числа.");
exit(1); }
delete a;
Управление динамической памятью (С++)1. Одно значениеОперация выделения памяти =new[()];Операция освобождения памятиdelete ;Примеры:а) int *k; k = new

Слайд 17Управление динамической памятью (С++)
2. Несколько значений
Операция выделения памяти для n

значений:
=new[];
Операция освобождения памяти:
delete [ ] ;

Пример:

short

*list;
list = new int [3];
*list=-244; *(list+1)=15; *(list+2)=-45;
delete[ ] list;
















2 2 2

list

list+1

list+2

Управление динамической памятью (С++)2. Несколько значенийОперация выделения памяти для n значений: =new[];Операция освобождения памяти:delete [ ] ;Пример:

Слайд 185.4 Многомерные массивы и указатели.
Объявление массива:
int *a;

|

int a[10];
a=calloc(10,4); |

a[2]=15; *(a+2)=15;

Примеры:
int list[10];
По правилам С++ имя массива является его адресом.
Поэтому для адресации элементов массива независимо от способа описания можно использовать адресную арифметику:
(list+i) ⇔ &(list[i])
*(list+i) ⇔ list[i]
5.4 Многомерные массивы и указатели.Объявление массива: int *a;

Слайд 19Многомерные массивы и указатели (2)
int m[2][3][2];
m -
*m =>

m[0][][]
**m => m[0][0][]
***m => m[0][0][0]

m[0][2][]

m[0][2][0] => *(*(*(m+0)+2)+0) =>*(*(*m+2))

m[i][j][k] =>

*(*(*(m+i)+j)+k) =>*(*(*(i+m)+j)+k)







m[0]

m[1]=>*(m+1)










Многомерные массивы и указатели (2)int m[2][3][2];m -*m   => m[0][][]**m  => m[0][0][]***m => m[0][0][0]m[0][2][]m[0][2][0] =>

Слайд 20Многоуровневые ссылки (Ex5_1a)
int m[]={1,2,3,4};
int *mp[]={m+3,m+2,m+1,m};
mp[0],*mp
mp[1],*(mp+1)
mp[2],*(mp+2)
mp[3],*(mp+3)
m[1],*(m+1)
или
mp[0][-2],
*(mp[0]-2),
*(*mp-2),
mp[1][-1],
*(mp[1]-1),
*(*(mp+1)-1)

Многоуровневые ссылки (Ex5_1a)int m[]={1,2,3,4};int *mp[]={m+3,m+2,m+1,m};mp[0],*mpmp[1],*(mp+1)mp[2],*(mp+2)mp[3],*(mp+3)m[1],*(m+1)илиmp[0][-2],*(mp[0]-2),*(*mp-2),mp[1][-1],*(mp[1]-1),*(*(mp+1)-1)

Слайд 21Использование указателей при обработки массивов
Пример. Написать программу переформирования матрицы путем

сортировки каждой ее строки по возрастанию ее элементов.
Создание динамиеской

матрицы
// Ex5_2.cpp
#include "stdafx.h"
#include
#include
int **mas,*ptr;
int a,b,n,m,i,j,k;
void main()
{ printf("\n input n= ");
scanf("%d",&n);
printf("\n input m= ");
scanf("%d",&m);
mas=new int * [n];
for(i=0;i mas[i]=new int [m];



mas

0

1

2

3













Массив указателей

Указатель на указатель

Одномерные массивы целого типа

Выделение памяти под массив указателей

Выделение памяти под строки матрицы

Использование указателей при обработки массивовПример. Написать программу переформирования матрицы путем сортировки каждой ее строки по возрастанию ее

Слайд 22Использование указателей при обработки массивов (2)
Заполнение матрицы данными
for(i=0;i

printf(" input %d elem. %d string\n",m,i);
ptr=mas[i];

for (j=0;j scanf("%d",mas[i]++);
mas[i]=ptr; }

Печать сформированной матрицы
puts("Inputed matrix");
for(i=0;i { ptr=mas[i];
for (j=0;j printf("%3d",*ptr++);
printf("\n");
}

Запоминаем адрес начала строки

Идем по элементам изменяя адрес элемента
(адресная арифметика)

Восстанавливаем адрес начала строки

Используем вспомогательный указатель для перемещения по строке

Использование указателей при обработки массивов (2)Заполнение матрицы даннымиfor(i=0;i

Слайд 23Использование указателей при обработки массивов(3)
Сортировка строк матрицы

for(i=0;i

for(j=0;j*(ptr+1))
{b=*ptr;*ptr=*(ptr+1);*(ptr+1)=b;}
Печать переформированной матрицы
puts("Sorted

matrix");
for(i=0;i { ptr=mas[i];
for (j=0;j printf("%3d",*ptr++);
printf("\n");
}
for(i=0;i delete [] mas[i];
delete [] mas;
}


Сортировка строки методом пузырька

Использование вспомогательного указателя для обхода матрицы

Удаление динамической матрицы. Идет в порядке, обратном созданию


Использование вспомогательного указателя для перестановок

Использование указателей при обработки массивов(3)Сортировка строк матрицыfor(i=0;i

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика