Указатели. Арифметика указателей. Динамическая память. Функции для работы с памятью

Смотреть слайды в полном размере
Презентация Указатели. Арифметика указателей. Динамическая память. Функции для работы с памятью

Презентация «Указатели. Арифметика указателей. Динамическая память. Функции для работы с памятью» содержит 57 слайдов и доступна в формате ppt. Размер файла: 498.00 KB

Вы можете предварительно ознакомиться с презентацией, просмотреть текст и слайды к ней, а также, в случае, если она вам подходит - скачать файл для редактирования или печати.

Просмотреть и скачать

Pic.1
ЛЕКЦИЯ 7 Указатели Арифметика указателей Динамическая память Функции для работы с памятью
ЛЕКЦИЯ 7 Указатели Арифметика указателей Динамическая память Функции для работы с памятью
Pic.2
Указатели Указатель – это переменная, значением которой является адрес, по которому располагаются да
Указатели Указатель – это переменная, значением которой является адрес, по которому располагаются данные. Адрес – это номер ячейки памяти, в которой или с которой располагаются данные. …
Pic.3
Указатели Типизированный указатель – указатель, содержащий адрес данных определенного типа (системно
Указатели Типизированный указатель – указатель, содержащий адрес данных определенного типа (системного или пользовательского). Не типизированный указатель – указатель, содержащий адрес данных …
Pic.4
Указатели Ближний указатель – указатель, содержащий только смещение, по которому располагаются данны
Указатели Ближний указатель – указатель, содержащий только смещение, по которому располагаются данные. Сегмент в этом случае используется по умолчанию – текущий сегмент данных. Размер ближнего …
Pic.5
Указатели Работа с указателями в языке С включает три действия, осуществляемых в следующем порядке:
Указатели Работа с указателями в языке С включает три действия, осуществляемых в следующем порядке: объявление указателя; установка указателя; обращение к значению, расположенному по указателю.
Pic.6
Указатели Объявление (описание) указателя в языке C имеет следующий вид: тип [near|far] *имя [=значе
Указатели Объявление (описание) указателя в языке C имеет следующий вид: тип [near|far] *имя [=значение]; В современной реализации языка C (стандарт C99), ориентированной под разработку программ для …
Pic.7
Указатели Указатель при объявлении можно инициализировать, указав через знак присвоения соответствую
Указатели Указатель при объявлении можно инициализировать, указав через знак присвоения соответствующее значение. Данное значение должно быть адресом, записанном в одном из следующих виде: нулевое …
Pic.8
Указатели Операция взятия адреса – операция языка C, возвращающая адрес переменной. Данная операция
Указатели Операция взятия адреса – операция языка C, возвращающая адрес переменной. Данная операция имеет следующий синтаксис: &имя_переменной Например, в программе описаны следующие переменные: …
Pic.9
Указатели Пример объявления не типизированного указателя с инициализацией нулевым значением: void *p
Указатели Пример объявления не типизированного указателя с инициализацией нулевым значением: void *ptr = NULL;
Pic.10
Указатели Установка указателя - присвоение его значению адреса, по которому располагаются или будут
Указатели Установка указателя - присвоение его значению адреса, по которому располагаются или будут располагаться данные. Для установки указателя используется оператор присвоения, в левой части …
Pic.11
Указатели Для обращения к значению, располагаемому по адресу, содержащемуся в указателе, используетс
Указатели Для обращения к значению, располагаемому по адресу, содержащемуся в указателе, используется операция разыменования указателя. Данная операция имеет следующий синтаксис: *имя_указателя …
Pic.12
Указатели В языке С можно создавать константные указатели – значение, расположенное по этому указате
Указатели В языке С можно создавать константные указатели – значение, расположенное по этому указателю нельзя изменить. Создание такого указателя имеет следующий синтаксис: const тип *имя = …
Pic.13
Указатели и массивы Объявление указателя на массив имеет тот же синтаксис, что и объявление обычного
Указатели и массивы Объявление указателя на массив имеет тот же синтаксис, что и объявление обычного указателя. Например, объявление указателя на вещественный массив типа double будет иметь вид: …
Pic.14
Указатели и массивы Фрагмент программы, в которой объявляется массив из 10 элементов целого типа, ос
Указатели и массивы Фрагмент программы, в которой объявляется массив из 10 элементов целого типа, осуществляется ввод массива с вычислением суммы его элементов и вывод значения этой суммы с …
Pic.15
Указатели и массивы Довольно часто встречаются случаи, когда необходимо работать с массивами указате
Указатели и массивы Довольно часто встречаются случаи, когда необходимо работать с массивами указателей. Синтаксис объявления массива указателей следующий: тип *имя[размер]; Например: вычисление …
Pic.16
Указатели и строки Объявление указателя на строку имеет тот же синтаксис, что и объявление указателя
Указатели и строки Объявление указателя на строку имеет тот же синтаксис, что и объявление указателя на символьный тип данных языка С: char *имя; Так как в языке С строка является массивом символов, …
Pic.17
Указатели и строки Работа со строкой как с массивом символов посредством указателя ничем не отличает
Указатели и строки Работа со строкой как с массивом символов посредством указателя ничем не отличается от работы с массивом. Например, ниже приведен фрагмент программы вычисления длины строки str …
Pic.18
Указатели и строки Интересной является возможность объявления указателей на строки и их установка на
Указатели и строки Интересной является возможность объявления указателей на строки и их установка на строковые константы. Например, возможно следующее: char *str = “Моя строка!”; puts(str);
Pic.19
Указатели и строки Например, в следующем фрагменте программы на экран выводится сообщение “Положител
Указатели и строки Например, в следующем фрагменте программы на экран выводится сообщение “Положительное значение”, если значение целочисленной переменной a больше нуля, “Отрицательное значение” – …
Pic.20
Указатели и перечисления Работа с указателями на перечислимый тип данных (enum) ничем не отличается
Указатели и перечисления Работа с указателями на перечислимый тип данных (enum) ничем не отличается от работы с указателями на целочисленный тип данных, так как перечислимый тип данных является …
Pic.21
Указатели и структуры Объявление указателя на структуры или объединения, а также установка указателя
Указатели и структуры Объявление указателя на структуры или объединения, а также установка указателя на структуры и объединения синтаксически не отличается от соответствующих действий с указателями …
Pic.22
Указатели и структуры Отличие заключается в обращении к полям структуры (объединения) через указател
Указатели и структуры Отличие заключается в обращении к полям структуры (объединения) через указатели на эти структуры (объединения). Возможны два варианта: (*имя_указателя). имя_поля …
Pic.23
Указатели и структуры Вычислить расстояние между двумя точками в двумерном пространстве (структура P
Указатели и структуры Вычислить расстояние между двумя точками в двумерном пространстве (структура Point2D): Point2D pnt[2], *ptr1 = &pnt[0], *ptr2 = &pnt[1]; printf(“Введите первую точку: …
Pic.24
Указатели и структуры Вычисление длины ломаной линии заданной массивом структур arr (структура Point
Указатели и структуры Вычисление длины ломаной линии заданной массивом структур arr (структура Point2D) размера N через указатель ptr на этот массив: Point2D arr[N] = {. . . }, *ptr = arr; double len …
Pic.25
Указатели и структуры Вычисление длины ломаной линии заданной массивом структур arr (структура Point
Указатели и структуры Вычисление длины ломаной линии заданной массивом структур arr (структура Point2D) размера N через массив указателей ptr на на элементы исходного массива: Point2D arr[N] = {. . . …
Pic.26
Арифметика указателей В языке С доступны некоторые арифметические действия над типизированными указа
Арифметика указателей В языке С доступны некоторые арифметические действия над типизированными указателями. Доступны следующие виды выражений: указатель++; ++указатель; указатель--; --указатель; …
Pic.27
Арифметика указателей Технически сложение (или вычитание) типизированного указателя и целого числа о
Арифметика указателей Технически сложение (или вычитание) типизированного указателя и целого числа означает «сдвиг» указателя на определенное число байт (в зависимости от размера типа указателя) …
Pic.28
Арифметика указателей Арифметика указателей наиболее часто применяется для доступа к элементам масси
Арифметика указателей Арифметика указателей наиболее часто применяется для доступа к элементам массивов. Например, вычисление суммы элементов целочисленного массива: int arr[10] = {. . . }, *ptr = …
Pic.29
Арифметика указателей Цикл в последнем фрагменте программы можно записать и несколько иначе: for(int
Арифметика указателей Цикл в последнем фрагменте программы можно записать и несколько иначе: for(int i=0;i<10;i++) summa += *(ptr+i);
Pic.30
Арифметика указателей Еще одним вариантом арифметики указателей является вычитание указателя из друг
Арифметика указателей Еще одним вариантом арифметики указателей является вычитание указателя из другого указателя, в виде: целочисленная переменная = указатель №1 – указатель №2; Результатом …
Pic.31
Динамическая память Традиционно весь объем памяти компьютера во время его работы разделяют на следую
Динамическая память Традиционно весь объем памяти компьютера во время его работы разделяют на следующие области: системная область, занимаемая базовой системой ввода и вывода, операционной системой, …
Pic.32
Динамическая память Динамическая память – это область (блок) памяти выделенный для нужд программы в
Динамическая память Динамическая память – это область (блок) памяти выделенный для нужд программы в процессе работы программы (а не заранее). Основными двумя действиями над динамической памятью …
Pic.33
Динамическая память Функция выделения блока памяти: void * malloc(size_t size); Например, фрагмент п
Динамическая память Функция выделения блока памяти: void * malloc(size_t size); Например, фрагмент программы выделения динамической памяти под структуру Point2D: Point2D *ptr = (Point2D …
Pic.34
Динамическая память Функция выделения блока памяти под массив: void * calloc(size_t num, size_t size
Динамическая память Функция выделения блока памяти под массив: void * calloc(size_t num, size_t size); Например, фрагмент программы для выделения динамической памяти под целочисленный массив из 20 …
Pic.35
Динамическая память Функция изменения размера выделенного ранее блока памяти: void * realloc(void *m
Динамическая память Функция изменения размера выделенного ранее блока памяти: void * realloc(void *memblock, size_t size); Например, увеличение целочисленного массива до 30-ти элементов: array = (int …
Pic.36
Динамическая память Функция освобождения динамической памяти: void free(void *memblock); Например, о
Динамическая память Функция освобождения динамической памяти: void free(void *memblock); Например, освобождение блока памяти, выделенного под структуру Point2D: free(ptr);
Pic.37
Динамическая память Помимо описанных функций для работы с динамической памятью (выделение и освобожд
Динамическая память Помимо описанных функций для работы с динамической памятью (выделение и освобождение) на практике широко используются функции работы с блоками памяти, описанные в библиотеке …
Pic.38
Динамическая память Функция копирования содержимого одного блока памяти в другой блок: void * memcpy
Динамическая память Функция копирования содержимого одного блока памяти в другой блок: void * memcpy(void * restrict targetbuf, const void * restrict sourcebuf, size_t num);
Pic.39
Динамическая память Функция копирования содержимого одного блока памяти в другой блок: void * memmov
Динамическая память Функция копирования содержимого одного блока памяти в другой блок: void * memmove(void *targetbuf, const void *sourcebuf, size_t num);
Pic.40
Динамическая память Функция сравнения двух блоков памяти: int memcmp(const void *buffer1, const void
Динамическая память Функция сравнения двух блоков памяти: int memcmp(const void *buffer1, const void *buffer2, size_t num);
Pic.41
Динамическая память Функция заполнения блока памяти: void * memset(void *buffer, int c, size_t num);
Динамическая память Функция заполнения блока памяти: void * memset(void *buffer, int c, size_t num);
Pic.42
Пример 1 Список точек в двумерном пространстве вводится пользователем: сначала указывается количеств
Пример 1 Список точек в двумерном пространстве вводится пользователем: сначала указывается количество элементов в списке, а затем вводятся сами элементы в формате (x,y). Определить две точки в списке …
Pic.43
Пример 1 #include <stdio. h> #include <stdlib. h> #include <math. h> int main(int
Пример 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("Введите количество …
Pic.44
Пример 1 int mins[2] = {0,1}, maxs[2] = {0,1}; double min = sqrt( pow(list[0]. x-list[1]. x,2. 0)+ p
Пример 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 …
Pic.45
Пример 1 printf("MAX: (%. 2lf,%. 2lf) - (%. 2lf,%. 2lf) : %. 2lf\n", list[maxs[0]]. x,list
Пример 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) - (%. …
Pic.46
Пример 2 Список окружностей (координаты центра и радиус) вводится пользователем: сначала вводится ко
Пример 2 Список окружностей (координаты центра и радиус) вводится пользователем: сначала вводится количество элементов в списке, а затем – сами элементы в формате (x,y) radius. Необходимо удалить из …
Pic.47
Пример 2 #include <stdio. h> #include <stdlib. h> #include <string. h> int main(in
Пример 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("Введите …
Pic.48
Пример 2 for(int i=0;i<num;i++) if(2. 0*list[i]. r*pi < midlen){ memcpy(&list[i],&list
Пример 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(“Результат: …
Pic.49
Пример 3 Создать в динамической памяти вещественную матрицу размера N×M (вводятся пользователем). Ос
Пример 3 Создать в динамической памяти вещественную матрицу размера N×M (вводятся пользователем). Осуществить ввод матрицы. Упорядочить строки матрицы в порядке увеличения или уменьшения суммы их …
Pic.50
Динамическая матрица
Динамическая матрица
Pic.51
Пример 3 #include <stdio. h> #include <stdlib. h> #include <string. h> int main(in
Пример 3 #include <stdio. h> #include <stdlib. h> #include <string. h> int main(int argc, char *argv[]) { int n,m; printf("Введите размеры матрицы: "); scanf("%d …
Pic.52
Пример 3 for(int i=0;i<n;i++){ summs[i] = 0. 0; matrix[i] = (double*)calloc(m,sizeof(double)); if
Пример 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("Мало …
Pic.53
Пример 3 int type = 0; printf("Введите 0– по возрастанию, не 0– по убыванию: "); scanf(&qu
Пример 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++) …
Pic.54
Пример 3 puts("Результат:"); for(int i=0;i<n;i++){ for(int j=0;j<m;j++) printf("
Пример 3 puts("Результат:"); for(int i=0;i<n;i++){ for(int j=0;j<m;j++) printf("%6. 2lf ",matrix[i][j]); free(matrix[i]); printf("\tSumma: %. 3lf\n",summs[i]); } …
Pic.55
Пример 4 Создать в динамической памяти массив строк. Строки вводятся пользователем, признак завершен
Пример 4 Создать в динамической памяти массив строк. Строки вводятся пользователем, признак завершения ввода – ввод пустой строки. Длина каждой строки не превышает 100 символов. Удалить из массива …
Pic.56
Пример 4 #include <stdio. h> #include <stdlib. h> #include <string. h> int main(in
Пример 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(“Вводите строки”); …
Pic.57
Пример 4 midlen /= count; for(int i=0;i<count;i++) if(strlen(list[i]) < midlen){ free(list[i])
Пример 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 …


Скачать презентацию

Если вам понравился сайт и размещенные на нем материалы, пожалуйста, не забывайте поделиться этой страничкой в социальных сетях и с друзьями! Спасибо!