- •2.Этапы создания исполняемой проги
- •Целые, вещественные, символьные и строковые константы в языке с
- •Простые типы данных в языке с
- •Диапазоны изменения значений простых типов данных в языке с. Спецификаторы типа: short, long, signed, unsigned
- •Типы данных с плавающей точкой и тип void в языке с
- •Выражения в языке с
- •Переменные в языке с, их описание и инициализация
- •Именованные константы в языке с
- •11.Операции языка с, их классификация и приоритеты
- •14.Операции инкремента и декремента
- •15. Операции явного преобразования типа и определения размера в языке с
- •18.Логические операции не, и, или в языке с (!, &&, //)
- •19.Условная операция (? :) в языке с
- •20.Операция запятая на языке с.
- •21.Операция взятия адреса и разадресации
- •22.Операторы в языке с. Составные операторы
- •23.Структура программы в языке с
- •24.Базовые конструкции структурного программирования
- •26.Операторы ветвления. Оператор switch
- •27.Операторы цикла в языке с
- •28.Цикл с предусловием while
- •29.Цикл с постусловием do-while
- •30.Цикл с параметром for. Операторы break и continue
- •31. Приведение цикла for к эквивалентному ему циклу while.
- •32. Варианты оператора for, связанные с упрощением его заголовка или тела цикла
- •33.Массивы в языке с, их описание и инициализация
- •34.Многомерные массивы в языке с, их описание и инициализация
- •35.Указатели и массивы. Правила адресной арифметики над указателями
- •36. Строки символов в языке с, их описание и инициализация
- •Функции, используемые в операциях ввода и вывода строк символов
- •38.Функции в языке с и их описание
- •40. Параметры функции. Передача параметров по значению и по адресу.
- •41.Передача массивов в качестве параметров функции
- •43. Функции стандартной библиотеки с
- •44.Функции форматного вывода и ввода printf и scanf
- •45.Перечисления в языке с
- •46.Структуры в языке с, их описание и инициализация
- •47.Массивы структур, их описание и инициализация
- •48. Битовые поля
- •49. Объединения в языке с
- •50. Переименование типов в языке с
33.Массивы в языке с, их описание и инициализация
Массив- это именованная совокупность переменных одного типа хранящихся в сложных ячейках оперативной памяти. Переменные входящие в состав массива наз. его элементами, имеют одно и тоже имя, но различаются своими порядковыми номерами (индексами). Индексы массива всегда начинаются с 0.
В прогах описание массива отличается от описания обычной переменной лишь наличием после имени квадратных скобок, в к-ых указывается кол-во элементов массива (размерность массива).
Если число инициализаторов ( [ ] ) совпадает с размерностью массива, то его можно не указывать. Если элементов в массиве больше, чем инициализаторов, элементы для к-ых значения не указаны обнуляются.
Размерность массива предпочтительнее задавать с помощью именованной константы, т.к.в этом случае для изменения размерности достаточно скорректировать значение константы лишь в одном месте проги.
Пример: найти сумму всех элементов массива.
# include <stdio.h>
Void main ( )
{
Const int N=10;
Int I, sum, mas [N];
For (i=0; i<N; i+)
Scanf (“%d”, & mas[ I ] );
F or (sum=0, i=0; i<N; i++)
S um+= mas[ I ]; for (sum=0, i=0; i<N; sum+=mas[ I ]; i++)
Printf (“сумма =%d \n”, sum);
}
34.Многомерные массивы в языке с, их описание и инициализация
Многомерные массивы задаются указанием каждого измерения в квадратных скобках. Int mas [3] [5];
Оператор задаёт описания двумерного массива из 3 строк и 5 столбцов, в памяти такой массив располагается в последовательных ячейках построчно, т.е.при переходе к следующему элементу быстрее всех изменяется последний индекс. Для доступа к элементу многомерного массива указываются все его индексы.
Инициализировать многомерный массив можно 2 способами:
задаётся общий список элементов, в том порядке в к-ом элементы располагаются в памяти.
Int nas [2] [4]= {1,2,3,4,5,6,7,8};
использовать представление виде массива из массивов, при этом каждый массив заключается в свои { }.
Int mas[ ][4]={{1,2,3,4},{5,6,7,8}}; . в обоих случаях левую размерность можно не указывать.
При работе с элементами многомерных массивов обычно используют вложенные циклы, как в следующем примере, где подсчитывается сумма значений всех элементов двумерного массива.
# include <stdio.h>
Void main ( )
{
Const int N=10, M=5;
Int i, j, sum , mas[N] [M];
For (i=0; i<N; i++)
For (i=0; i<M; i++)
Scanf (“%d”, &mas [I ][ j ]);
For (sum=0; i<N; i++)
For (i=0; i<M; i++)
Sum+= mas[ I ][ j ];
Printf (“сумма =%d \n”, sum);
35.Указатели и массивы. Правила адресной арифметики над указателями
В языке С сущ.очень тесная связь между указателем и массивом : любой доступ к элементу массива по его индексу может быть выполнен при помощи указателя, при чём последний вариант работает быстрее и предпочтителен. Рассмотрим следующие операторы: int mas[N]; -описание целочисленного массива размерности N. Int *p; - указатель на целочисленную переменную, к-ая пока ни на что не указывает. Если выполнить присваивание, p=&mas[0]; - то теперь указатель p, будет содержать адрес начального элемента массива или другим словами будет указывать на элементы mas[0].
Правила адресной арифметики над указателями .Как только такое присваивание выполнено можно применять правила адресной арифметики над указателями, суть к-ых заключается в том, что если указатель p указывает на некоторый элемент массива, то p увеличенный на 1 будет указывать на след. элемент, а p увеличенный на i, будет указывать на i элемент по отношению к элементу на к-ый он указывал вначале. Каждый элемент занимает 4 байта.
P mas [0]
P +1 mas[1]
P +2 mas[2]
… . …….
P +N-1 mas[N-1]
Т.к. операция разадресации ( * ) позволяет получить значение элемента массива, на который указывает указатель, то можно записать следующее:
*p = mas[0
*(p+1) = mas[1]
*(p+2) = mas[2]
…….=……….
*(p+N-1)= mas[N-1]
Отсюда видно , что доступ к элементу массива по его индексу может быть выполнен при помощи указателя. С другой стороны имя массива в языке С есть ни что иной как адрес его начального элемента, поэтому присваивание p= &mas[0 ]; можно заменить на : p= mas; поэтому можно записать следующее:
*mas mas[0]
* (mas+1) mas[1]
*(mas+2) mas[2]
…… …..
*(mas+N-1)= mas[N-1]
Между указателем и именем массива существует одно существенное различие. Указатель это переменная предназначенная для хранения любых адресов. Поэтому можно написать: p++ или p+= i. Но имя массива не является
переменной- это указатель константа на начальный элемент массива. И записи вида mas++ или mas+=i не допустимы.
Пример: вывести на экран значения всех элементов массива введенных с клавы.
# include <stdio.h>
Void main ( )
{
Const int N=10;
Int I, mas[N];
Int p;
P= mas;
For (i=0; i<N; i++)
Scanf (“%d”, p+i);
For (i=0; i<N; i++)
Printf (“%d \t”, *(p+i));
}
Пример 2: вывод на экран всех значений двухмерного массива
# include <stdio.h>
Void main ( )
{
Const int N=2, M=4;
Int mas[N][M]*p, I, j;
P= & mas[0][0]; // p=mas[0]
P=*mas;
For (i=0, i<N; i++)
Scanf (“%d”, p+i);
Printf (“%d %c, *p++, (i+1)% M : \n”);
}
P=mas[0]=*mas mas[0][0]
P+1=mas[0]+1=*mas+1 mas[0][1]
P+1=mas[0]+2=*mas+2 mas[0][2]
P+1=mas[0]+3=*mas+3 mas[0][3]
P+4=mas[1 ] = *(mas+1) mas[1][0]
P+5=mas[1 ] +1= *(mas+1)+1 mas[1][1]
………………. …………..