Локальные и глобальные переменные

Время жизни объекта может быть глобальным и локальным.
Глобальными называют объекты, объявление которых дано вне функции. Они доступны (видимы) во всем файле, в котором они объявлены. В течение всего времени выполнения программы с глобальным объектом ассоциирована некоторая ячейка памяти.

Локальными называют объекты, объявление которых дано внутри блока или функции. Эти объекты доступны только внутри того блока, в котором они объявлены. Объектам с локальным временем жизни выделяется новая ячейка памяти каждый раз при осуществлении описания внутри блока. Когда выполнение блока завершается, память, выделенная под локальный объект, освобождается, и объект теряет своё значение.

Пример

#include <stdio.h>
void autofunc(void)

{

int k=1; // локальный объект

printf(" \n k = %d ", k);

k=k+1;
}
int main() {

for(int i = 0; i<=5; i++) // областьвидимости i - цикл

autofunc();

getchar();

return 0;
}

Область видимости локальной переменной k - функция autofunc(). Каждый раз при входе в функцию с идентификатором k ассоциируется некоторая ячейка памяти, в которую помещается значение равное 1.

Результат выполнения программы

Та же программа, но с использованием глобального объекта

#include <stdio.h>
int k=1; // глобальный объект
void autofunc(void)

{

printf(" \n k = %d ", k);

k=k+1;
}
int main() {

for(int i = 0; i<=5; i++) // область видимости i - цикл

autofunc();

getchar();

return 0;
}

Результат выполнения программы

С помощью глобальных переменных можно организовать обмен информацией между функциями. При этом вызываемая функция не будет принимать значения глобальных переменных в качестве формальных аргументов. Однако в этом случае существует опасность случайного изменения глобальных объектов другими функциями.

Пример

#include <stdio.h>
int x, y, z; // глобальные переменные
void sum(void)

{

z = x + y;

}
int main() {

printf("x= ");

scanf("%d",&x);

printf("y= ");

scanf("%d",&y);

sum();

printf("z= %d", z);

getchar(); getchar();

return 0;
}

Массивы в языке Си

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

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

Массив характеризуется следующими основными понятиями:

Элемент массива (значение элемента массива) – значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.

Каждый элемент массива характеризуется тремя величинами:

· адресом элемента - адресом начальной ячейки памяти, в которой расположен этот элемент;

· индексом элемента (порядковым номером элемента в массиве);

· значением элемента.

Адрес массива – адрес начального элемента массива.
Имя массива – идентификатор, используемый для обращения к элементам массива.
Размер массива – количество элементов массива
Размер элемента – количество байт, занимаемых одним элементом массива.

Графически расположение массива в памяти компьютера можно представить в виде непрерывной ленты адресов.

Представленный на рисунке массив содержит q элементов с индексами от 0 до q-1. Каждый элемент занимает в памяти компьютера k байт, причем расположение элементов в памяти последовательное.

Адреса i-го элемента массива имеет значение

n+k·i

Адрес массива представляет собой адрес начального (нулевого) элемента массива. Для обращения к элементам массива используется порядковый номер (индекс) элемента, начальное значение которого равно 0. Так, если массив содержит q элементов, то индексы элементов массива меняются в пределах от 0 до q-1.

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

Длина Массива = Размер Элемента * Количество Элементов

Для определения размера элемента массива может использоваться функция

int sizeof(тип);

Например,

sizeof(char) = 1;
sizeof(int) = 4;
sizeof(float) = 4;
sizeof(double) = 8;