
- •Оглавление.
- •Этапы создания программного продукта.
- •Структурирование программы.
- •Этапы получения программного кода
- •Функциональная декомпозиция
- •Алгоритм программы
- •Линейные алгоритмы
- •Развилка
- •Функция main
- •Блоки кода
- •Комментарии
- •Базовые понятия языка Си.
- •Специфика присвоения имён.
- •Ключевые слова Си
- •Понятие lvalue и rvalue.
- •Типы данных.
- •Функции
- •Блоки кода программы.
- •Операторы языка c.
- •Логические операторы
- •Тернарный оператор
- •Базовые типы данных. Типы данных
- •1)Базовые
- •2)Производные
- •Файловый ввод - вывод.
- •Булевые переменные (тип bool).
- •Понятие, объявление и определение.
- •Ключевое слово typedef.
- •Виды компоновки программ:
- •Скрытие имени переменной.
- •Инструкции условий.
- •Переключатель switch
- •Инструкции цикла.
- •Инструкции безусловного перехода.
- •Препроцессор. Заголовочные файлы. Директивы препроцессора.
- •Список директив препроцессора (все начинаются с #).
- •Предопределённые идентификаторы.
- •Диагностический макрос (микрокоманда) assert.
- •Указатели.
- •Инициализация указателя и оператор получения адреса объекта.
- •Арифметика указателей.
- •Массивы.
- •Объявление встроенного массива.
- •Инициализация массива.
- •Явная инициализация.
- •Обращение к элементу массива. Оператор [].
- •Связь массивов и указателей.
- •Двумерные массивы.
- •Оператор new и массивы.
- •Многомерные массивы.
- •Ссылки.
- •Объявление:
- •Инициализация:
- •Получение значений:
- •Функции.
- •Определение функции (реализация).
- •Вызов inline функции.
- •Способы передачи параметров
- •Использование “ , ” , формирование параметров.
- •Указатели на массивы в качестве параметров функции.
- •Значения аргументов функций по умолчанию.
- •Переменное число параметров функции.
- •Функции стандартной библиотеки
- •Виды возвращаемых значений и механизмы их формирования.
- •Проблемы при возвращении ссылки или указателя.
- •Ключевое слово const.
- •“Перегрузка” имён функции.
- •Возможный конфликт при использовании параметров по умолчанию.
- •Рекурсивные функции.
- •Структуры Си.
- •Структуры и функции.
Связь массивов и указателей.
Имя одномерного массива компилятор интерпретирует как константный указатель на нулевой элемент массива.
ar[0]=1 |
ar[1]=2 |
ar[2]=3 |
ar[3]=4 |
ar[4]=5 |

p
В памяти:
int *p=ar;
int *int [];
i
nt
tmp=ar[i];
равнозначно
tmp=p[i];
tmp=*(p+i);
tmp=*(ar+i);
переместим указатель к следующему элементу массива, но не ar++(ошибка!)
p++; //ar++i
Двумерные массивы.
Двумерные массивы можно представить как одномерный, каждым элементом которого является строка (т.е. одномерный массив). Имя двумерного массива компилятор интерпретирует как константный указатель на нулевую строку.
int ar[2][3]={{1;2;3},{4;5;6}};
ar[0][0]=1 |
ar[0][1]=2 |
ar[0][2]=3 |
ar[1][0]=4 |
ar[1][1]=5 |
ar[1][2]=6 |
int sum!=0;
for (int i=0; i<N; i++)
{
for (int j=0; j<M; j++)
sum+=ar[i][j];
int *p=&ar[0][0];
for (int i=0; i<sizeof(ar)/sizeof(int); i++)
{
sum+=*p;
p++;
}
}
Трёхмерные массивы.
Имя трёхмерного массива компилятор интерпретирует как константный указатель на нулевой слой (нулевой двумерный массив).
int ar[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},{{-1,-2,-3,-4},{-5,-6,-7,-8},{-9,-10, -11,-12 }}}
Массивы указателей.
char *ar[20];
char *ar[]={ “One”,”Two”,”Three” };
char ar1[][6]={ “One”,”Two”,”Three” };
char ar1[3][6];
Т.к. в запрещённом режиме строковые литералы, расположенные в области памяти, защищены от записи, попытка изменить их вызовет ошибку времени выполнения.
ar1[1][1]= //ar[1][1]=”D”; - ошибка!
Динамическое распределение памяти.
malloc
calloc
realloc
free
int Mbyte=…;
int *p=static_cast<int*>(malloc(Mbyte));
if (p)…
size_t n=_msize(p)
calloc - обнуляет содержимое памяти
realloc - изменяет размер ранее захваченного блока памяти
p=ststic_cast<int*> realloc(p,2000);
free - освобождается выделенная память
free(p)
Управление памятью. Оператор new и delete.
Преимущество new и delete:
необязательно явно указывать количество требуемых байт;
результатом выделившейся памяти с помощью malloc является указатель с типом <void *>, в случае использования new: компилятор неявно приводит тип указателя к указанному типу;
оператор new совмещает выделившуюся память с вызовом инициализирующей функции;
int *p=new int; //sizeof(int)
malloc(4)
int *p=operator new (sizeof(int));
При динамическом выделении памяти из-за большого количества информации, «накладные» расходы достаточно велики.
delete(p);
Оператор new и массивы.
Создавать массивы следует только тогда, когда:
все или некоторые размерности массива определяются только во время выполнения программы;
размерности массива могут измениться в процессе программы.
Не стоит забывать об удалении (освобождении) динамически занятой памяти.
int n=выражение;
//int ar[n]; // ERROR!!!
int *pn=new int[n]; //выделившийся в памяти блок размером n*sizeof(int)+служебная информация
pn[i]=…;
int *tmp=new int[n*z];
for (int i=0; i<n; i++){tmp[i]=pn[i];}
memcpy(tmp,pn,n*sizeof(int));
delete[]pn;
pn=tmp;
pn[i]=…;
delete[]pn;
delete[]tmp;
pn= Ø;
tmp= Ø;