Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по киту.doc
Скачиваний:
7
Добавлен:
15.04.2019
Размер:
292.86 Кб
Скачать

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]

……………….  …………..