Время жизни объекта может быть глобальным и локальным.
Глобальными называют объекты, объявление которых дано вне функции. Они доступны (видимы) во всем файле, в котором они объявлены. В течение всего времени выполнения программы с глобальным объектом ассоциирована некоторая ячейка памяти.
Локальными называют объекты, объявление которых дано внутри блока или функции. Эти объекты доступны только внутри того блока, в котором они объявлены. Объектам с локальным временем жизни выделяется новая ячейка памяти каждый раз при осуществлении описания внутри блока. Когда выполнение блока завершается, память, выделенная под локальный объект, освобождается, и объект теряет своё значение.
Пример
#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;