Презентация Указатели. Арифметика указателей. Динамическая память. Функции для работы с памятью онлайн
На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Указатели. Арифметика указателей. Динамическая память. Функции для работы с памятью абсолютно бесплатно. Урок-презентация на эту тему содержит всего 57 слайдов. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Устройства и комплектующие » Указатели. Арифметика указателей. Динамическая память. Функции для работы с памятью
Оцените!
Оцените презентацию от 1 до 5 баллов!
- Тип файла:ppt / pptx (powerpoint)
- Всего слайдов:57 слайдов
- Для класса:1,2,3,4,5,6,7,8,9,10,11
- Размер файла:498.00 kB
- Просмотров:103
- Скачиваний:0
- Автор:неизвестен
Слайды и текст к этой презентации:
№2 слайд
![Указатели Указатель это](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img1.jpg)
Содержание слайда: Указатели
Указатель – это переменная, значением которой является адрес, по которому располагаются данные.
Адрес – это номер ячейки памяти, в которой или с которой располагаются данные.
Классифицировать указатели можно:
по типу данных (типизированные и не типизированные указатели);
по области доступа (ближние и дальние указатели).
№4 слайд
![Указатели Ближний указатель](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img3.jpg)
Содержание слайда: Указатели
Ближний указатель – указатель, содержащий только смещение, по которому располагаются данные. Сегмент в этом случае используется по умолчанию – текущий сегмент данных. Размер ближнего указателя в 16-разрядном реальном режиме работы процессора составляет 16 бит, а в 32-разрядном защищенном режиме – 32 бита.
Дальний указатель – указатель, содержащий и сегмент и смещение. Размер дальнего указателя в 16-разрядном реальном режиме работы процессора составляет 32 бита (16 бит – сегмент, 16 бит - смещение), а в 32-разрядном защищенном режиме – 48 бит (16 бит – селектор, 32 бита - смещение).
№6 слайд
![Указатели Объявление описание](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img5.jpg)
Содержание слайда: Указатели
Объявление (описание) указателя в языке C имеет следующий вид:
тип [near|far] *имя [=значение];
В современной реализации языка C (стандарт C99), ориентированной под разработку программ для ОС Windows, вследствие используемой в ОС Windows модели памяти, используются исключительно ближние (near) указатели, поэтому при объявлении указателя (например, в среде разработки Pelles C) модификатор области доступа указывать не надо.
№7 слайд
![Указатели Указатель при](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img6.jpg)
Содержание слайда: Указатели
Указатель при объявлении можно инициализировать, указав через знак присвоения соответствующее значение. Данное значение должно быть адресом, записанном в одном из следующих виде:
нулевое значение (идентификатор NULL);
другой указатель;
адрес переменной (через операцию взятия адреса);
выражение, представляющее собой арифметику указателей;
адрес, являющийся результатом выделения динамической памяти.
№8 слайд
![Указатели Операция взятия](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img7.jpg)
Содержание слайда: Указатели
Операция взятия адреса – операция языка C, возвращающая адрес переменной. Данная операция имеет следующий синтаксис:
&имя_переменной
Например, в программе описаны следующие переменные:
int a,b;
double c;
Описание указателей на эти переменные с инициализацией будет иметь вид:
int *ptr_a = &a, *ptr_b = &b;
double *ptr_c1 = &c, *ptr_c2 = ptr_c1;
№10 слайд
![Указатели Установка указателя](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img9.jpg)
Содержание слайда: Указатели
Установка указателя - присвоение его значению адреса, по которому располагаются или будут располагаться данные.
Для установки указателя используется оператор присвоения, в левой части которого указывается имя указателя, а в правой – одно из значений отличных от NULL, используемых при инициализации указателя. Пример установки указателей:
int a = 10, *ptr = NULL;
ptr = &a;
№11 слайд
![Указатели Для обращения к](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img10.jpg)
Содержание слайда: Указатели
Для обращения к значению, располагаемому по адресу, содержащемуся в указателе, используется операция разыменования указателя. Данная операция имеет следующий синтаксис:
*имя_указателя
Значение, полученное путем разыменования указателя, может рассматриваться в программе как LValue, так и RValue значение. Например:
double x = 0.0, *ptr = NULL;
ptr = &x;
scanf(“%lf”,ptr);
*ptr += 1.5;
printf(“%lf\n”,*ptr);
№12 слайд
![Указатели В языке С можно](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img11.jpg)
Содержание слайда: Указатели
В языке С можно создавать константные указатели – значение, расположенное по этому указателю нельзя изменить. Создание такого указателя имеет следующий синтаксис:
const тип *имя = инициализирующее значение;
Например, следующий фрагмент программы приведет к ошибке компиляции:
int a = 10;
const int *ptr = &a;
(*ptr)++;
№13 слайд
![Указатели и массивы](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img12.jpg)
Содержание слайда: Указатели и массивы
Объявление указателя на массив имеет тот же синтаксис, что и объявление обычного указателя. Например, объявление указателя на вещественный массив типа double будет иметь вид:
double *arrptr = NULL;
Объявление целочисленного массива из десяти элементов с инициализацией нулевыми значениями, и объявление с инициализацией указателя на этот массив будут иметь вид:
int arr[10] = {0}, *arrptr = arr;
№14 слайд
![Указатели и массивы Фрагмент](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img13.jpg)
Содержание слайда: Указатели и массивы
Фрагмент программы, в которой объявляется массив из 10 элементов целого типа, осуществляется ввод массива с вычислением суммы его элементов и вывод значения этой суммы с использованием указателей на массив и на переменную для хранения суммы:
int array[10] = {0}, summa = 0;
int *arrptr = array, *ptr = &summa;
for(int i=0;i<10;i++){
scanf(“%d”,&arrptr[i]);
*ptr += arrptr[i];
}
printf(“Сумма: %d\n”,*ptr);
№15 слайд
![Указатели и массивы Довольно](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img14.jpg)
Содержание слайда: Указатели и массивы
Довольно часто встречаются случаи, когда необходимо работать с массивами указателей. Синтаксис объявления массива указателей следующий:
тип *имя[размер];
Например: вычисление суммы набора целых чисел через обращение к ним посредством массива указателей на целые числа:
int arr[10], *ptrs[10], summa = 0;
for(int i=0;i<10;i++) ptrs[i] = &arr[i];
for(int i=0;i<10;i++){
scanf(“%d”,ptrs[i]);
summa+= *ptrs[i];
}
printf(“Сумма: %d\n”,summa);
№16 слайд
![Указатели и строки Объявление](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img15.jpg)
Содержание слайда: Указатели и строки
Объявление указателя на строку имеет тот же синтаксис, что и объявление указателя на символьный тип данных языка С:
char *имя;
Так как в языке С строка является массивом символов, а имя массива есть указатель на этот массив, то установка указателя на строку осуществляется путем присвоения указателю имени этой строки. Например:
char str[] = “Моя строка!”, *ptr = str;
№17 слайд
![Указатели и строки Работа со](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img16.jpg)
Содержание слайда: Указатели и строки
Работа со строкой как с массивом символов посредством указателя ничем не отличается от работы с массивом. Например, ниже приведен фрагмент программы вычисления длины строки str посредством обращения к ней через указатель ptr:
char *ptr = str;
int len = 0;
while(ptr[len]!=0) len++;
printf(“Длина строки: %d\n”,len);
№19 слайд
![Указатели и строки Например,](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img18.jpg)
Содержание слайда: Указатели и строки
Например, в следующем фрагменте программы на экран выводится сообщение “Положительное значение”, если значение целочисленной переменной a больше нуля, “Отрицательное значение” – если меньше и “Нулевое значение” – если ноль:
int a = 0;
printf(“Введите число: ”); scanf(“%d”,&a);
char *str = NULL;
if(a > 0) str = “Положительное значение”;
else if(a < 0) str = “Отрицательное значение”;
else str = “Нулевое значение”;
puts(str);
№21 слайд
![Указатели и структуры](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img20.jpg)
Содержание слайда: Указатели и структуры
Объявление указателя на структуры или объединения, а также установка указателя на структуры и объединения синтаксически не отличается от соответствующих действий с указателями на скалярные типы данных. Например:
typedef struct {double x,y;} Point2D;
Point2D pnt = {0.0,0.0}, *ptr = &pnt;
№23 слайд
![Указатели и структуры](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img22.jpg)
Содержание слайда: Указатели и структуры
Вычислить расстояние между двумя точками в двумерном пространстве (структура Point2D):
Point2D pnt[2], *ptr1 = &pnt[0], *ptr2 = &pnt[1];
printf(“Введите первую точку: ”);
scanf(“%lf %lf”,&ptr1->x,&ptr1->y);
printf(“Введите вторую точку: ”);
scanf(“%lf %lf”,&ptr2->x,&ptr2->y);
double len = sqrt(
pow(ptr1->x - ptr2->x, 2.0)+
pow(ptr1->y - ptr2->y, 2.0)
);
printf(“Расстояние: %lf\n”,len);
№24 слайд
![Указатели и структуры](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img23.jpg)
Содержание слайда: Указатели и структуры
Вычисление длины ломаной линии заданной массивом структур arr (структура Point2D) размера N через указатель ptr на этот массив:
Point2D arr[N] = {...}, *ptr = arr;
double len = 0.0;
for(int i=1;i<N;i++)
len += sqrt(
pow(ptr[i].x - ptr[i-1].x, 2.0)+
pow(ptr[i].y - ptr[i-1].y, 2.0)
);
printf(“Длина ломаной линии: %lf\n”,len);
№25 слайд
![Указатели и структуры](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img24.jpg)
Содержание слайда: Указатели и структуры
Вычисление длины ломаной линии заданной массивом структур arr (структура Point2D) размера N через массив указателей ptr на на элементы исходного массива:
Point2D arr[N] = {...}, *ptrs[N];
for(int i=0;i<N;i++) ptrs[i] = &arr[i];
double len = 0.0;
for(int i=1;i<N;i++)
len += sqrt(
pow(ptrs[i]->x - ptrs[i-1]->x, 2.0)+
pow(ptrs[i]->y - ptrs[i-1]->y, 2.0)
);
printf(“Длина ломаной линии: %lf\n”,len);
№26 слайд
![Арифметика указателей В языке](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img25.jpg)
Содержание слайда: Арифметика указателей
В языке С доступны некоторые арифметические действия над типизированными указателями.
Доступны следующие виды выражений:
указатель++; ++указатель;
указатель--; --указатель;
указатель = указатель + (целочисленное выражение);
указатель += (целочисленное выражение);
указатель = указатель - (целочисленное выражение);
указатель -= (целочисленное выражение);
№27 слайд
![Арифметика указателей](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img26.jpg)
Содержание слайда: Арифметика указателей
Технически сложение (или вычитание) типизированного указателя и целого числа означает «сдвиг» указателя на определенное число байт (в зависимости от размера типа указателя) «вправо» (или «влево»).
Примеры:
int *a, *b, *c; //Объявление указателей
double *x, *y;
... //Установка указателей
a++; //Сдвиг вправо на 4 байта
b-=3; //Сдвиг влево на 12 байт
c=a+2; //Смещение с относительно a на 8 байт
y = x--; //Х смещается влево на 8 байт
№28 слайд
![Арифметика указателей](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img27.jpg)
Содержание слайда: Арифметика указателей
Арифметика указателей наиболее часто применяется для доступа к элементам массивов. Например, вычисление суммы элементов целочисленного массива:
int arr[10] = {...}, *ptr = NULL, summa = 0;
ptr = arr; //или ptr = &arr[0];
for(int i=0;i<10;i++,ptr++) summa +=*ptr;
printf(“Сумма: %d\n”, summa);
№30 слайд
![Арифметика указателей Еще](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img29.jpg)
Содержание слайда: Арифметика указателей
Еще одним вариантом арифметики указателей является вычитание указателя из другого указателя, в виде:
целочисленная переменная = указатель №1 – указатель №2;
Результатом вычитания указателей является целое значение равное расстоянию между адресами, содержащимися в указателях.
Например:
int arr[10], *ptr1 = arr, *ptr2 = &arr[1], *ptr3 = &arr[4];
int dest1 = ptr2 - ptr1, dest2 = ptr2 - ptr3;
printf("%d\n%d\n",dest1,dest2);
На экране будет выведено:
1
-3
№31 слайд
![Динамическая память](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img30.jpg)
Содержание слайда: Динамическая память
Традиционно весь объем памяти компьютера во время его работы разделяют на следующие области:
системная область, занимаемая базовой системой ввода и вывода, операционной системой, сервисами операционной системы и драйверами различных устройств;
область пользовательских программ, занимаемая программами или сервисами, которые запустил пользователь компьютера в процессе работы с ним;
свободная память, доступная для загрузки других программ или сервисов.
№32 слайд
![Динамическая память](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img31.jpg)
Содержание слайда: Динамическая память
Динамическая память – это область (блок) памяти выделенный для нужд программы в процессе работы программы (а не заранее).
Основными двумя действиями над динамической памятью являются: выделение и освобождение. В языке С функции для осуществления этих действия описаны в библиотеке stdlib.h.
№42 слайд
![Пример Список точек в](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img41.jpg)
Содержание слайда: Пример 1
Список точек в двумерном пространстве вводится пользователем: сначала указывается количество элементов в списке, а затем вводятся сами элементы в формате (x,y). Определить две точки в списке максимально удаленные друг от друга и две точки – максимально приближенные друг к другу. Найденные точки вывести в формате: (x,y) – (x,y) : расстояние. Список точек создается в динамической памяти.
№43 слайд
![Пример include lt stdio.h gt](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img42.jpg)
Содержание слайда: Пример 1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
typedef struct{double x,y;} Point2D;
int num;
printf("Введите количество точек: "); scanf("%d",&num);
if(num < 3) {puts("Слишком мало точек!"); return 0;}
Point2D *list = (Point2D *)calloc(num,sizeof(Point2D));
if(!list) {puts("Недостаточно памяти!"); return 0;}
puts(“Введите список точек: ”);
for(int i=0;i<num;i++){
fflush(stdin);
scanf("(%lf,%lf)",&list[i].x,&list[i].y);
}
№44 слайд
![Пример int mins , , maxs ,](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img43.jpg)
Содержание слайда: Пример 1
int mins[2] = {0,1}, maxs[2] = {0,1};
double min = sqrt(
pow(list[0].x-list[1].x,2.0)+
pow(list[0].y-list[1].y,2.0)
),
max = min;
for(int i=0;i<num-1;i++)
for(int j=i+1;j<num;j++){
double len = sqrt(
pow(list[i].x-list[j].x,2.0)+
pow(list[i].y-list[j].y,2.0)
);
if(len > max){
max = len; maxs[0] = i; maxs[1] = j;
}else if(len < min){
min = len; mins[0] = i; mins[1] = j;
}
}
№45 слайд
![Пример printf quot MAX . lf,](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img44.jpg)
Содержание слайда: Пример 1
printf("MAX: (%.2lf,%.2lf) - (%.2lf,%.2lf) : %.2lf\n",
list[maxs[0]].x,list[maxs[0]].y,
list[maxs[1]].x,list[maxs[1]].y,max);
printf("MIN: (%.2lf,%.2lf) - (%.2lf,%.2lf) : %.2lf\n",
list[mins[0]].x,list[mins[0]].y,
list[mins[1]].x,list[mins[1]].y,min);
free(list);
return 0;
}
№46 слайд
![Пример Список окружностей](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img45.jpg)
Содержание слайда: Пример 2
Список окружностей (координаты центра и радиус) вводится пользователем: сначала вводится количество элементов в списке, а затем – сами элементы в формате (x,y) radius. Необходимо удалить из списка все окружности, длина которых меньше средней длины. Полученный список вывести на экран.
№47 слайд
![Пример include lt stdio.h gt](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img46.jpg)
Содержание слайда: Пример 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
typedef struct{double x,y,r;} CIRCLE;
int num;
printf("Введите количество записей: "); scanf("%d",&num);
if(num < 2) {puts("Слишком мало записей!"); return 0;}
CIRCLE *list = (CIRCLE *)calloc(num,sizeof(CIRCLE));
if(!list) {puts("Few memory!"); return 0;}
double midlen = 0;
puts("Введите список: ");
for(int i=0;i<num;i++){
fflush(stdin);
scanf("(%lf,%lf) %lf",
&list[i].x,&list[i].y,&list[i].r);
midlen += 2.0*list[i].r*pi;
}
midlen /= num;
№48 слайд
![Пример for int i i lt num i](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img47.jpg)
Содержание слайда: Пример 2
for(int i=0;i<num;i++)
if(2.0*list[i].r*pi < midlen){
memcpy(&list[i],&list[i+1],sizeof(CIRCLE)*(num-i-1));
num--;
i--;
}
list = (CIRCLE *)realloc(list,num);
puts(“Результат: ”);
for(int i=0;i<num;i++)
printf("(%.2lf,%.2lf) %.2lf\n",
list[i].x,list[i].y,list[i].r);
free(list);
return 0;
}
№49 слайд
![Пример Создать в динамической](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img48.jpg)
Содержание слайда: Пример 3
Создать в динамической памяти вещественную матрицу размера N×M (вводятся пользователем). Осуществить ввод матрицы. Упорядочить строки матрицы в порядке увеличения или уменьшения суммы их элементов (направление выбирает пользователь). Полученную матрицу вывести на экран.
№51 слайд
![Пример include lt stdio.h gt](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img50.jpg)
Содержание слайда: Пример 3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int n,m;
printf("Введите размеры матрицы: ");
scanf("%d %d",&n,&m);
if((n<2)||(m<2)) {puts("Неправильный ввод!"); return 0;}
double **matrix = (double **)calloc(n,sizeof(double *));
if(!matrix) {puts("Мало памяти!"); return 0;}
double *summs = (double *)calloc(n,sizeof(double));
if(!summs) {
free(matrix);
puts("Мало памяти!"); return 0;
}
№52 слайд
![Пример for int i i lt n i](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img51.jpg)
Содержание слайда: Пример 3
for(int i=0;i<n;i++){
summs[i] = 0.0;
matrix[i] = (double*)calloc(m,sizeof(double));
if(!matrix[i]){
for(int j=0;j<i;j++) free(matrix[i]);
free(matrix); free(summs);
puts("Мало памяти!"); return 0;
}
}
puts("Введите матрицу:");
for(int i=0;i<n;i++) for(int j=0;j<m;j++){
scanf("%lf",&matrix[i][j]);
summs[i] += matrix[i][j];
}
№53 слайд
![Пример int type printf quot](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img52.jpg)
Содержание слайда: Пример 3
int type = 0;
printf("Введите 0– по возрастанию, не 0– по убыванию: ");
scanf("%d",&type);
int flag = 1;
while(flag){
flag = 0;
for(int i=0;i<n-1;i++)
if((!type&&(summs[i] > summs[i+1]))||
( type&&(summs[i] < summs[i+1]))){
double *ptr = matrix[i], sum = summs[i];
matrix[i] = matrix[i+1]; summs[i] = summs[i+1];
matrix[i+1] = ptr; summs[i+1] = sum;
flag = 1;
}
}
№55 слайд
![Пример Создать в динамической](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img54.jpg)
Содержание слайда: Пример 4
Создать в динамической памяти массив строк. Строки вводятся пользователем, признак завершения ввода – ввод пустой строки. Длина каждой строки не превышает 100 символов. Удалить из массива все строки, длина которых меньше средней длины всех введенных строк. Полученный массив вывести на экран. При реализации обеспечить эффективное хранение строк в памяти: память под строки выделяется динамически, с учетом длины строки.
№56 слайд
![Пример include lt stdio.h gt](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img55.jpg)
Содержание слайда: Пример 4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char **list = NULL;
int count = 0, midlen = 0;
puts(“Вводите строки”);
while(1){
char str[101];
gets(str);
if(strcmp(str,"")==0) break;
char **tmp = (char**)realloc(list, (count+1)*sizeof(char*));
if(!tmp) {puts("Мало памяти!"); break;}
list = tmp;
list[count] = (char *)malloc(strlen(str)+1);
if(!list[count]) {puts("Мало памяти!"); break;}
midlen += strlen(str); strcpy(list[count],str); count++;
}
№57 слайд
![Пример midlen count for int i](/documents_6/612dc3b8a15ea66e76e1c4476f700eea/img56.jpg)
Содержание слайда: Пример 4
midlen /= count;
for(int i=0;i<count;i++)
if(strlen(list[i]) < midlen){
free(list[i]);
memcpy(&list[i],&list[i+1],(count-i-1)*sizeof(char*));
count--;
i--;
}
list = (char **)realloc(list,count*sizeof(char*));
puts(“Результат: ”);
for(int i=0;i<count;i++){
puts(list[i]); free(list[i]);
}
free(list);
return 0;
}
Скачать все slide презентации Указатели. Арифметика указателей. Динамическая память. Функции для работы с памятью одним архивом:
Похожие презентации
-
Указатели и работа с памятью
-
Язык программирования С. Указатель. Массив и указатель. Арифметика для указателей
-
Работа с динамической памятью
-
Управление памятью и указатели
-
Разработка параллельных программ для систем с распределенной памятью
-
PHP. Функции работы с массивами. Работа с указателями и сериализация
-
Методы разработки параллельных программ для многопроцессорных систем с общей памятью OpenMP. (Лекция 16)
-
Динамическая память. Лекция 1
-
Программирование циклических алгоритмов. Операции с памятью. Обработка структур данных (массивов)
-
Функции ОС для работы с векторами прерываний