Лекция 6 1. Обработка массивов
Объявление одномерного массива Синтаксис: [ ] Пример: int a[10]; Определяет массив a размера 10, т. е. блок из 10 последо- вательных объектов типа int с именами a[0], a[1],..., a[9]. a: a[0] a[1] … a[9]
Сортировка массива Сортировка методом поиска наименьшего элемента int a[] = {4, 0, 1, 17, 78, 34, 2, 24, 11, 8}; int i,j, tmp;... for (i = 0; i < 9; i++) { for (j = i + 1; j < 10; j++) { if (a[j] < a[i]) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; } …
Сортировка массива Сортировка пузырьковым методом int a[10];... int i, swap, temp; do { swap = 0; for (i = 0; i < 9; i++) if (a[i] > a[i + 1]) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; swap = 1; } } while (swap == 1)
Многомерные массивы Объявление двумерного массива: int a[2][5]; Расположение массива в памяти a[0][0] a[0][4] a[1][4] a[1][0] a[0][0] a[0][4]a[1][0] a[1][4]
Многомерные массивы Индексирование многомерных массивов: Правильно: a[i][j] Неправильно: a[i,j] Инициализация массива a[ ][ ]={ {…}, {…}, …, {…}}; NNN M
Двумерные массивы (матрицы) char days[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} } int year, month;... int leap = year % 4 == 0; printf("Дней в месяце: %d", days[leap][month - 1]);
Операции с массивами Заполнение матрицы случайными числами int a[3][5]; /* матрица 3 на 5 */... int i,j; for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { a[i][j] = rand() % 100; } i j
Операции с массивами Задача: посчитать сумму под главной диагональю (включая саму диагональ) int a[5][5]; /* матрица 5 на 5 */... int i,j, sum = 0; for (i = 0; i < 5; i++) { for (j = 0; j
Указатели
Указатель – это переменная, в которой хранится адрес ячейки памяти (т.е. который указывает на ячейку памяти). ………xpx
Указатели Унарная операция & выдает адрес объекта. Пример: p = &x; pi = &a[4]; Оператор & применяется только к объектам, расположенным в памяти: к переменным и элементам массивов.
Указатели Унарный оператор * есть оператор косвенного доступа. Примененный к указателю он выдает объект, на который данный указатель указывает. Пример: *p = a; b = *p;
Объявление указателей Синтакис: * ; Пример: int *p1; /* указатель на int */ int *p2 = &a; int *p4 = NULL; int *a[10]; /* массив из 10 указателей */ int **p; /* указатель на указатель на int */
Использование указателей Пример 1 int i; int *pi = &i; *pi = *pi + 10; /* увеличивает *pi на 10 */ *pi += 1; /* увеличивает *pi на 1 */ ++*pi; /* увеличивает *pi на 1 */ (*pi)++; /* увеличивает *pi на 1 */ *pi++; /* !!! Увеличивает значение указателя! */ int *p2; p2 = pi; /* теперь p2 и pi указывают на один и тот же объект */
Указатели и массивы int a[10]; a: a[0] a[1] … a[9] int *pa; pa = &a[0]; /* pa указывает на 0-й эл-м массива */ x = *pa; /* копирует значение a[0] в x */ Если pa указывает на некоторый эл-т массива, то pa+1 указывает на следующий и т.д.
Массивы и указатели Значение переменной или выражения типа массив есть адрес нулевого элемента массива. int a[10]; int *pa; pa = &a[0] равносильно pa = a a[i] равносильно *(pa + i) &a[i] равносильно a + i pa[i] равносильно *(pa + i)
Различие между массивом и указателем Указатель - это переменная. Но имя массива не является переменной. int a[10]; int* pa; pa = a; /* верно */ pa++; /* верно */ a = pa; /* ОШИБКА */ a++; /* ОШИБКА */
Массивы. Границы массива Внимание! Язык «Си» не проверят «выход» за границы массива! Пример 1: int a[10]; int y = 123; for (i = 0; i < 20; i++) a[i] = 0; Пример 2: int a[10]; int *pa = &a[5]; for (i = 0; i < 10; i++) pa[i] = 0; Пример 3: int a[10]; int *pa = &a[5]; for (i = -5; i < 5; i++) pa[i] = 0;
Строки
Строка – это массив символов, заканчивающийся нулевым символом "Я строка" = printf("здравствуй, мир\n"); Объявление строковых переменных: char mystr[ ] = "Моя строка"; /* массив */ char *pstr = "Моя строка"; /* указатель */ char *str2 = pstr; /* Строка не копируется! */ Я с т р о к а \0
Строки Вычисление длины строки char mystr[] = "Это строка"; char* s = mystr; int n; for (n =0; *s != '\0'; n++) s++; printf("Длина строки: %d", n);