Си. Модуль 9

Содержание

Слайд 2

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА Декларация указателей Операции с указателями Использование указателей

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Декларация указателей
Операции с указателями
Использование указателей как аргументов функции
Указатели на

функции
Указатели и массивы
Указатели и строки
Слайд 3

Понятие указателя. Определение указателей на объекты Указатель — переменная простого производного

Понятие указателя. Определение указателей на объекты

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

данных, значением которой выступает адресное выражение, или указатель-константа. Значением указателя, как правило, служит беззнаковый целочисленный адрес другой переменной (ее первого байта), функции (точки входа в нее) либо не равный никакому другому условно «нулевой» адрес, обычно обозначаемый неарифметической константой NULL
Определение указателя на переменную конкретного типа данных
<имя типа> *<идентификатор>;
Определение указателя на переменную произвольного типа данных
void *<идентификатор>;

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Слайд 4

Операции над указателями на объекты Важнейшими операциями над указателями на объекты

Операции над указателями на объекты

Важнейшими операциями над указателями на объекты являются:
присваивание

значения (=);
разыменование (косвенная адресация) (*);
получение адреса указателя (&);
изменение значения указателя (++, --);
операции типа «сложение» (адресная арифметика, см. ниже);
операции сравнения с указателями на объекты того же типа или константой NULL (<, <=, >, >=, ==, !=)
Допустимые арифметические операции над указателями на объекты (L — левый операнд, R — правый):
сложение без знака (+) указателя (L) с целочисленным выражением (R);
вычитание без знака (-) целочисленного выражения (R) из указателя(L);
вычитание со знаком (-) указателей на объекты одного типа (L, R)
рекомендуемый тип разности указателей — ptrdiff_t, определен в stddef.h (не зависит от применяемого транслятора)

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Слайд 5

Практика Модуль 9. АДРЕСНАЯ АРИФМЕТИКА Написать функцию обмена значениями для двух

Практика

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Написать функцию обмена значениями для двух переменных.
Написать функцию

вычисления минимума и максимума для одномерного массива.
Слайд 6

Указатели и массивы Согласно синтаксису языка Си идентификатор массива без индексов

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

Согласно синтаксису языка Си идентификатор массива без индексов элементов

— это указатель-константа со значением адреса нулевого (имеющего индекс [0]) элемента массива
С учетом адресной арифметики, обращение к произвольному элементу массива данных любого типа может производиться одним из двух равнозначных способов, которые допускается комбинировать в случае многомерных массивов:
<имя массива>[<индекс элемента>]
*(<имя массива> + <индекс элемента>)

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Слайд 7

Одномерный массив int data[5]; int *p; p=data; data[5] это *(data+5) это

Одномерный массив
int data[5];
int *p;
p=data;
data[5] это *(data+5) это *(5+data) это 5[data]
p[5] это

*(p+5) это *(5+p) это 5[p]
Массив массивов
int data2[3][7];
??? p2;
p2 = data2;

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Слайд 8

Функция как производный тип. Указатель на функцию (начало) Функция как производный

Функция как производный тип. Указатель на функцию (начало)

Функция как производный тип

языка введена в Си для решения задач, в которых функция (ее адрес) должна являться операндом некоторых операций, параметром другой функции или возвращаемым другой функцией результатом
Указатель на функцию — адресное выражение (в частном случае — переменная-указатель), значением которого выступает адрес первого байта (первого машинного слова) исполнимого кода функции
Значением идентификатора любой функции, введенного в ее определении (прототипе), является константный указатель на эту функцию

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Слайд 9

Указатель на функцию (продолжение) Определение переменной-указателя на функцию с конкретной спецификацией

Указатель на функцию (продолжение)

Определение переменной-указателя на функцию с конкретной спецификацией параметров
<тип

результата> (*<идентификатор>)
([<спецификация формальных параметров>]);
Три формы записи операции вызова функции ()
явный вызов по имени (константному указателю)
<имя функции> (<список фактических параметров>)
вызов с разыменованием неконстантного указателя
(*<идентификатор>)(<список фактических параметров>)
вызов без разыменования неконстантного указателя
<идентификатор>(<список фактических параметров>)

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Слайд 10

Указатель на функцию (окончание) Допустимые операции над указателями на функции присваивание

Указатель на функцию (окончание)

Допустимые операции над указателями на функции
присваивание значения (=)

(только для константных и переменных указателей на функции того же типа — с совпадающими типами всех формальных параметров и возвращаемого значения);
разыменование (косвенная адресация) (*);
получение адреса указателя (&);
операции сравнения с указателями на функции того же типа (см. выше) или константой NULL (==, !=)
Арифметические операции над указателями на функции запрещены

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Слайд 11

Практика / ДЗ Модуль 9. АДРЕСНАЯ АРИФМЕТИКА Сортировка одномерного массива с

Практика / ДЗ

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Сортировка одномерного массива с использованием функции

qsort().
Выполнить сортировку одномерного массива так, чтобы сначала шли все чётные числа по возрастанию, а затем нечётные по убыванию.
Слайд 12

Строки Модуль 9. АДРЕСНАЯ АРИФМЕТИКА Строки в Си реализованы как одномерные

Строки

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Строки в Си реализованы как одномерные массивы символов.

Последним символом в строке должен быть нулевой байт – ‘\0’.
Примеры объявления строк:
char * s1 = “Hello”;
char buf[50] = {0};
char * s2 = malloc( length );
char txt[20][80];
char * s3[20];
Слайд 13

Практика / ДЗ Модуль 9. АДРЕСНАЯ АРИФМЕТИКА Написать функцию определения длины

Практика / ДЗ

Модуль 9. АДРЕСНАЯ АРИФМЕТИКА

Написать функцию определения длины строки.
Написать функцию

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