
- •Алгоритмы поиска
- •Последовательный поиск
- •Бинарный поиск
- •Инструкции
- •Предпроцессор. Заголовочные файлы. Директивы предпроцессора
- •Указатели
- •В иды указателей
- •Арифметика указателей
- •Указатель типа void*
- •Указатель на указатель
- •Указатель и ключевые слова const, volatile
- •Массивы
- •Примеры объявления массива
- •Инициализация массива
- •Неявная инициализация
- •Явная инициализация массива
- •Массивы и оператор sizeof
- •Трехмерные массивы
- •Связь массивов и указателей
- •Трехмерные массивы
- •Массивы указателей
- •Динамическое распределение памяти
- •Оператор new и массивы
- •Функции
- •Объявление (прототип) функции
- •Объявление inline-функции.
- •Определение
- •Вызов функции
- •Вызов inline – функции
- •2 Способ:
- •3 Пример:
- •Параметры значения
- •Параметры функции main
- •В озвращаемые значения
- •Ключевое слово const и функция
- •«Перегрузка» имен функции
- •Рекурсивные функции
- •Структуры c
Трехмерные массивы
int n=sizeof(ar)/sizeof(int); //всего элементов
n= sizeof(ar)/sizeof(ar [0][0]); //число строк
n= sizeof(ar)/ sizeof(ar [0]); //число столбцов
n = sizeof(ar [0][0])/ sizeof(int); //число элементов в строке
Связь массивов и указателей
Одномерный массив.
Имя одномерного массива компилятор интерпретирует как константный указатель на нулевой элемент массива.
1 |
2 |
3 |
4 |
5 |
ar

int *p=ar;
int tmp=ar[i];
tmp = p[i];
или
tmp=*(p+1);
tmp=*(ar+i);
p++;
ar++;
Двумерные массивы
Двумерный массив компилятор представляет в виде одномерного массива, каждым элементом которого является строка. Имя двумерного массива компилятор интерпретирует как нулевую строку.
int ar [2][3]={{1,2,3},{4,5,6}};
a
0
строка
r[0][0]=1;
ar[0][1]=2;
ar[0][2]=3;
a
1
строка
ar[1][1]=5;
ar[1][2]=6;
int b;
ar[1][1]=4;
int *p=ar[0];//+
int *p1=ar; // -
int **p2=ar; //+
int **p3=ar[0][0]//-
b=*(p)//+
b=*(p1)//-
b=*(p2)//-
b=*(p3)//-
int c;
c=**(p);//-
c=**(p2);//+
int d;
d=p[2];
d=p2[1][1];// так делать можно
int ar[2][3]={{1,2,3},{4,5,6}};
sum=0;
for(j=0;j<2;j++)
{
for(int i=0; i<3;i++)
{
sum+=ar[i][j];
}
} //сумма элементов массива
sum=0;
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}}};
ar[0][0][0] = 1;
ar[0][0][1] = 2;
ar[0][2][3] = 12;
ar[1][0][0] = -1;
ar[1][2][3] = -12;
Сумма элементов:
int sum=0;
int *p=&ar[0][0][0];
for(int i=0; i<sizeof (ar)/sizeof(int);i++)
{
sum+=*p;
p++;
}
Массивы указателей
Элементами массива могут быть любые данные, в том числе и указатели
а) char *ar[20];//объявлен одномерный массив из указателей
char *ar[20]={0};
б) инициализация массива указателей строковыми литералами
char *ar[]={«one», «two», «three»};
Замечание. Существуют принципиальные различия
1) в расположении памяти массива указателей и, на первый взгляд, подобному ему двумерного массива
char ar1[][6]= {«one», «two», «three»};
2) в использовании массивов, где
char ar1[][6];
Динамическое распределение памяти
Для работы с динамической памятью используется стандартная библиотека <stdlib>.
Функции для работы с динамической памятью:
malloc – выделяет указанное в качестве параметра количество байт в heap (область памяти, куча). Если память выделить не удалось, то возвращается нулевой указатель. Тип возвращаемого указателя void*.
calloc – обнуляет содержимое данной памяти
int size = 24000м0000;
int *p = static_cast <int*>(malloc(size));// преобразование в указатель типа int
int *pp=(int*)(malloc(size)); // используется не во всех операционных системах
для проверки выделения памяти:
if (!p) return;
для получения размера выделенного блока памяти используется функция _msize
size_t n=_msize(p);
для изменения размера выделенной памяти используется функция realloc
p=static_cast<int*>(realloc(p,100));
if (!p)
функция free освобождает память.
Управление памятью: операторы new и delete
При динамическом программировании рекомендуется использовать операторы new и delete. Особенности использования new:
не обязательно указывать число выделяемых байт
не требуется явно приводить тип возвращаемого значения
оператор new совмещает выделение памяти с вызовом инициализирующей функции
int *p=new int; //выделяется 4 байта
delete (p);
p=0;