Начальная инициализация массива. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Начальная инициализация массива.



Напишем простую программу. Создадим массив, после чего найдём его максимальный элемент.

 

#include <conio.h>

#include <stdio.h>

 

void main() {

int a[10] = {1, 2, 5, 3, 9, 6, 7, 7, 2, 4};

unsigned i;

int max;

 

max = a[0];

for (i = 1; i<10; i++) {

if (a[i] > max) {

max = a[i];

}

}

 

printf("max element is %d", max);

getch();

}

 

Разберём пример. Сначала мы создаём массив и инициализируем его при создании. После этого присваиваем максимальному найденному элементу значение первого элемента массива.

 

max = a[0];

 

После чего проходим по массиву. Так как мы уже просмотрели первый элемент (у него индекс 1), то нет смысла снова его просматривать.

Тот же пример, только теперь пользователь вводит значения.

 

#include <conio.h>

#include <stdio.h>

 

void main() {

int a[10];

unsigned i;

int max;

 

printf("Enter 10 numbers\n");

for (i = 0; i<10; i++) {

printf("%d. ", i);

scanf("%d", &a[i]);

}

 

max = a[0];

for (i = 1; i<10; i++) {

if (a[i] > max) {

max = a[i];

}

}

 

printf("max element is %d", max);

getch();

}

 

В том случае, если при инициализации указано меньше значений, чем размер массива, остальные элементы заполняются нулями.

 

#include <conio.h>

#include <stdio.h>

 

void main() {

int a[10] = {1,2,3};

unsigned i;

 

for (i = 0; i<10; i++) {

printf("%d ", a[i]);

}

 

getch();

}

 

Если необходимо заполнить весь массив нулями, тогда пишем

 

int a[10] = {0};

 

Можно не задавать размер массива явно, например

 

int a[] = {1, 2, 3};

 

массив будет иметь размер 3

Размер массива

Массив в си должен иметь константный размер. Это значит, что невозможно, например, запросить у пользователя размер, а потом задать этот размер массиву.

 

printf("Enter length of array ");

scanf("%d", &length);

 

{

float x[length];

}

 

Создание динамических массивов будет рассмотрено дальше, при работе с указателями и памятью.

В некоторых случаях можно узнать размер массива с помощью функции sizeof.

 

#include <conio.h>

#include <stdio.h>

 

void main() {

int A[57];

//sizeof возвращает размер всего массива в байтах

//Для определения количества элементов необходимо

//разделить размер массива на размер его элемента

int size = sizeof(A) / sizeof(int);

 

printf("Size of array equals to %d", size);

getch();

}

 

Но это вряд ли будет полезным. При передаче массива в качестве аргумента функции будет передаваться указатель, поэтому размер массива будет невозможно узнать.

Статические массивы удобны, когда заранее известно число элементов. Они предоставляют быстрый, но небезопасный доступ до элементов.

Переполнение массива

Пускай у вас есть такой код

 

int A[10];

int i;

 

for (i=0; i<=10; i++) {

A[i] = 1;

}

 

Здесь цикл for задан с ошибкой. В некоторых старых версиях компиляторов этот код зацикливался. Дело в том, что переменная i располагалась при компиляции сразу за массивом A. При выходе за границы массива счётчик переводился в 1.

Массивы небезопасны, так как неправильная работа с индексом может приводить к доступу к произвольному участку памяти (Теоретически. Современные компиляторы сами заботятся о том, чтобы вы не копались в чужой памяти).

Если вы работаете с массивами, то необходимо следить за тем, чтобы счётчик не превышал размер массива и не был отрицательным. Для этого, как минимум:

· Используйте тип size_t для индексирования. Он обезопасит вас от отрицательных значений и его всегда хватит для массива любого размера.

· Помните, что массив начинается с нуля.

· Последний элемент массива имеет индекс (размер массива - 1)

Никаких полноценных способов проверки, вышли мы за пределы массива или нет, не существует. Поэтому либо мы точно знаем его размер, либо храним в переменной и считываем при надобности.

Пример с одномерным массивом

Теперь несколько типичных примеров работы с массивами

 

#include <conio.h>

#include <stdio.h>

 

//Это макрос. SIZE в коде будет заменено на 10u

#define SIZE 10u

 

void main() {

int A[SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

unsigned i, j; //счётчики

unsigned half; //середина массива

unsigned tmp; //временная переменная для обмена значениями

 

half = SIZE / 2;

//Один счётчик идёт слева напрво, другой справа налево

for (i = 0, j = SIZE - 1; i < half; i++, j--) {

tmp = A[i];

A[i] = A[j];

A[j] = tmp;

}

 

for (i = 0; i < SIZE; i++) {

printf("%d ", A[i]);

}

 

getch();

}

 

Здесь незнакомая для вас конструкция

 

#define SIZE 10u

 

макрос. Во всём коде препроцессор автоматически заменит все вхождения SIZE на 10u.



Поделиться:


Последнее изменение этой страницы: 2017-01-20; просмотров: 269; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.83.150 (0.006 с.)