
- •МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального
- •составные типы языка Си:
- •это составной тип данных, состоящий из
- •Оперативная
- •Над указателями можно производить:
- •Динамический объект – объект создаваемый в процессе выполнения программы
- •Пример 1
- •имя массива
- •Операторы
- •Объявление двумерного массива r[n][m]
- •Возможные типы определений символьных массивов:
- •это независимая совокупность объявлений и Функция - операторов, предназначенная для выполнения
- •задает ее заголовок, объявления локальных Определение функции - объектов (констант, переменных и т.п.)
- •Определение функции, не возвращающей значение:
- •задает ее имя, типы и число формальных Объявление функции – параметров, тип значения,
- •Формальные параметры – это фактически шаблоны, под которые в действительности не выделяется память,
- •Правила описания функций:
- •С использованием указателей:
- •С использованием ссылочных переменных:
- •void swap(int *a, int *b)
- •Пример:
- •Рекурсивный вызов функции – это когда функция вызывает саму себя
- •Формат заголовка функции с переменным количеством параметров:
- •1-ый подход
- •возможность функции по-разному выполняться
- •Определение указателя на функцию:
- •это составной объект, в котором под одним именем Структура – объединяются элементы одного
- •1 вариант
- •Элемент структур по другому еще называют поле
- •Битовое поле задается следующим образом:
- •Определение объединения:
- •Оператор описания типа:
- •Оператора описания объекта:
- •Характеристика:
- •Времени жизни объекта:
- •Неявные преобразования:
- •В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это
- •Выражение E может быть явно преобразовано к типу (имя_типа) при помощи оператора:
- •Препроцессор –
- •Общая форма определения макроса:

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Основы программирования и алгоритмические языки
(лекции по курсу Информатика для бакалавров направления 140800 )
Преподаватель каф. ЭАФУ
Нагайцева Ольга Викторовна
Томск 2012

составные типы языка Си:
массивы
указатели
функции пользователя
структуры
битовые поля
объединения
оператор описания типа
классы памяти
преобразование типов
директивы препроцессора
2

это составной тип данных, состоящий из
Массив – элементов одного и того же типа (элементы в памяти
располагаются подряд)
Оператор объявления массива: |
Обращение к элементу массива: |
тип_данных имя [n1][n2]…[nk]; |
имя_массива [i1][i2]…[ik] |
|
|
где |
где |
ni – размерности массива |
0 ≤ ij ≤ nj-1 |
k – мерность массива |
nj – максимальное значение j-го |
индекса массива
!!!!!! элементы массива нумеруются с 0 до ni-1 Примеры:
int mass[10]; // описание одномерного массива
float A[10][9]; // описание двумерного массива
A[1][3]=5; mass[9]=2; // обращение к элементам массивов
3

|
|
|
|
|
Указатель – |
это объект заданного типа, который содержит |
|
|
|
адрес другого объекта, т.е. адрес ячейки памяти |
|
|
|
|
|
|
|
|
|
Оператор объявления указателя:
тип данных *имя указателя;
Примеры:
int *p; // указатель на переменную типа int
struct {int x,y;} *p; //указатель на структуру
complex *p; // указатель на пользовательский
тип complex
Операции над указателями:
Операция & - «взять адрес»
Операция * - «взять значение, по указанному адресу»
4

Оперативная
Пример 1
# include <stdio.h> main ()
{
float x = 10.1, y; float * pf ;
pf = &x ; y = *pf ;
printf(“x = %f y= %f”, x, y); // Результат: x=10.1; y=10.1; pf=632
}
5

Над указателями можно производить:
арифметические операции:
сложения и вычитанияоперации (++) и (--)
операции отношения:
<, >, < =, > =, =, = =, ! =
Пример 2:
# include <stdio.h> main()
{
int *p; int x; p = &x;
printf (“%p”, p); ++p;
printf (“%p”,p);
}
Оперативная
память
6

Динамический объект – объект создаваемый в процессе выполнения программы
Функции динамического выделения памяти:
char * malloc(size);
char * calloc(nelem, elsize);
обе функции возвращают указатель на созданный динамический объект
где
sizeof (T)
возвращает число байт необходимых для хранения
объекта T в памяти
7

Пример 1
int *P=(int *) malloc(sizeof (int));
Пример 2 (Объявление одномерного массива) int *r = (int*) malloc (n*sizeof(int));
или
int *r = (int*) calloc (n, sizeof(int));
Пример 3 (Объявление двумерного массива) int **r = (int**) malloc(n*sizeof(int*));
for (i=0; i<n; i++) r[i] = (int*) malloc(n*sizeof(int));
free(Т) – функция явного освобождения памяти от динамического объекта Т
Пример free(P);
Указание на произвольную ячейку памяти
Например, определен указатель
int *p;
тогда указатель на ячейку памяти 0777000 можно получить с помощью следующего оператора:
p=(int*)0777000;
8

имя массива
это указатель-константа, который содержит адрес его первого элемента
Соответственно
действие записи:
имя_массива [индекс];
Пример 1 int mas[3]; int *ptr;
ptr = mas; // присваивает адрес указателю
// следующие операции дадут один и тот же результат:
mas[2] = 20; *(ptr + 2) = 20;
// следующая операция прибавит 2 к первому элементу:
*ptr=*ptr + 2;
массив
можно рассматривать как
индексированный указатель
можно объяснить так
*(имя_массива + индекс);
9

Операторы
int mas[ ]; и int *mas;
оба объявляют mas указателем
!!!!!!!Нужно помнить!!!!!
mas[ ] – указатель-константа*mas – указатель-переменная
Пример 2
int mas[ ] = {1, 2, 3, 4};
int *ptr=(int*)malloc(sizeof(n*sizeof(int));
mas= ptr; // недопустимый оператор ptr=mas; // опасный оператор
Пример 3
ptr++ // допустимая конструкция mas++ // запрещенная конструкция
ptr + i; mas + i; // разрешенные операции
для любого массива соблюдается:
имя_массива == &имя_массива==&имя_массивах[0]
10

|
Оперативная |
|
|
int mas[2][2]; // объявление двумерного массива |
память |
int *ptr; // объявление указателя |
|
ptr = mas; // указателю присваивается адрес первого |
|
элемента массива |
|
(ptr = = mas = = &mas[0][0])
ptr +1; // увеличим значение указателя на 1
(ptr = = mas = = &mas[0][1])
ptr + 2; // увеличим значение указателя на 2
(ptr = = mas = = &mas[1][0])
ptr + 3; // увеличим значение указателя на 3
(ptr = = mas = = &mas[1][1])
т.о. многомерный массив можно представить как массив массивов
11