
- •Язык высокого програмирования “с”
- •Переменные и типы переменных.
- •2.1 Типы данных в си
- •Подробное описание типов данных в языке си
- •Комплексные числа в си
- •Логический тип данных в си
- •Операторы объявлений
- •Константы в си
- •Оператор создания типов данных в си
- •Неявное приведение типа
- •Явное приведение типа в языке c
- •1.1. Арифметические операции
- •2.4 Побитовые операции в си
- •№3 Циклические алгоритмы.
- •Операция присваивания
- •Операции отношения
- •Арифметические операции
- •Логические операции
- •Сдвиговые операции
- •3.2 Цикл с предусловием while
- •Цикл с постусловием do...While
- •Цикл с постусловием
- •Параметрический цикл for
- •Рекомендации по выбору цикла
- •Операторы break и continue
- •Оператор безусловного перехода goto
- •Синтаксис
- •Синтаксис
- •Заметки
- •Синтаксис
- •Заметки
- •Тернарные операции
- •Оператор ветвления switch (оператор множественного выбора)
- •№5 Указатели и массивы.
- •Объявление и инициализация массивов
- •Многомерные массивы
- •Инициализация многомерных массивов
- •Передача массива в функцию
- •5.2 И 5.3
- •5.1 Указатели и адреса
- •5.2 Указатели и аргументы функций
- •5.3 Указатели и массивы
- •5.4 Адресная арифметика
- •5.5 Символьные указатели функции
- •5.6 Массивы указателей, указатели на указатели
- •5.7 Многомерные массивы
- •5.8 Инициализация массивов указателей
- •5.9 Указатели против многомерных массивов
- •5.10 Аргументы командной строки
- •5.11 Указатели на функции
- •5.12 Сложные объявления
- •5.4 Указатели типа void
Многомерные массивы
В языке Си могут быть также объявлены многомерные массивы. Отличие многомерного массива от одномерного состоит в том, что в одномерном массиве положение элемента определяется одним индексом, а в многомерном — несколькими. Примером многомерного массива является матрица.
Общая форма объявления многомерного массива
тип имя[размерность1][размерность2]...[размерностьm];
Элементы многомерного массива располагаются в последовательных ячейках оперативной памяти по возрастанию адресов. В памяти компьютера элементы многомерного массива располагаются подряд, например массив, имеющий 2 строки и 3 столбца,
int a[2][3];
будет расположен в памяти следующим образом
Общее
количество элементов в приведенном
двумерном массиве определится
как
КоличествоСтрок
* КоличествоСтолбцов = 2 * 3 = 6.
Количество
байт памяти, требуемых для размещения
массива, определится как
КоличествоЭлементов
* РазмерЭлемента = 6 * 4 = 24 байта.
Инициализация многомерных массивов
Значения элементов многомерного массива, как и в одномерном случае, могут быть заданы константными значениями при объявлении, заключенными в фигурные скобки {}. Однако в этом случае указание количества элементов в строках и столбцах должно быть обязательно указано в квадратных скобках [].
Пример
#include <stdio.h> int main() {
int a[2][3]={1, 2, 3, 4, 5, 6};
printf("%d %d %d\n", a[0][0], a[0][1], a[0][2]);
printf("%d %d %d\n", a[1][0], a[1][1], a[1][2]);
getchar();
return 0; }
Результат
выполнения
Однако
чаще требуется вводить значения элементов
многомерного массива в процессе
выполнения программы. С этой целью
удобно использовать вложенныйпараметрический
цикл.
Пример
#include <stdio.h> int main() {
int a[2][3]; // массив из 2 строк и 3 столбцов
int i, j;
// Ввод элементов массива
for(i=0; i<2; i++) // цикл по строкам
{
for(j=0; j<3; j++) // цикл по столбцам
{
printf("a[%d][%d] = ", i,j);
scanf("%d", &a[i][j]);
}
}
// Вывод элементов массива
for(i=0; i<2; i++) // цикл по строкам
{
for(j=0; j<3; j++) // цикл по столбцам
{
printf("%d ", a[i][j]);
}
printf("\n"); // перевод на новую строку
}
getchar();
getchar();
return 0; }
Результат
выполнения
Передача массива в функцию
Обработку массивов удобно организовывать с помощью специальных функций. Для обработки массива в качестве аргументов функции необходимо передать
адрес массива,
размер массива.
Исключение составляют функции обработки строк, в которые достаточно передать только адрес.
При передаче переменные в качестве аргументов функции данные передаются как копии. Это означает, что если внутри функции произойдет изменение значения параметра, то это никак не повлияет на его значение внутри вызывающей функции.
Если в функцию передается адрес переменной (или адрес массива), то все операции, выполняемые в функции с данными, находящимися в пределах видимости указанного адреса, производятся над оригиналом данных, поэтому исходный массив (или значение переменной) может быть изменено вызываемой функцией.
Пример Дан массив из 10 элементов. Поменять местами наибольший и начальный элементы массива. Для операций поиска максимального элемента и обмена использовать функцию.
#include <stdio.h>
// Функция обмена
void change(int *x, int n) { // x - указатель на массив (адрес массива)
// n - размер массива
int i;
int max, index;
max = x[0];
index = 0;
// Поиск максимального элемента
for(i=1; i<n; i++)
{
if(x[i]>max)
{
max= x[i];
index = i;
}
} // Обмен
x[index] = x[0];
x[0] = max; } int main() {
int a[10];
int i;
for(i=0; i<10; i++)
{
printf("a[%d] = ", i);
scanf("%d", &a[i]);
}
change(a,10); // вызов функции обмена
// Вывод элементов массива
for(i=0; i<10; i++)
{
printf("%d ", a[i]);
}
getchar();
getchar();
return 0; }
Результат
выполнения
Пример
Дан массив размерности n. Вычислить
произведение четных элементов
#include <stdio.h> int func(int *x, int n) { // произведение четных элементов
int p=1; // начальное значение произведения
int i;
for(i=0;i<n; i++) {
if(x[i] % 2==0) // остаток от деления на 2 равен 0?
p = p * x[i];
}
return p; } int main() {
int a[5]; // объявлен массив a из 5 элементов
int i;
int pr;
// Ввод элементов массива
for(i=0; i<5; i++) {
printf("a[%d] = ", i);
scanf("%d", &a[i]); // &a[i] - адрес i-го элемента массива
}
pr = func(a, 5); // вычисление произведения
printf("\n pr = %d", pr); // вывод произведения четных элементов
getchar();
getchar();
return 0; }
Результат
выполнения