русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Классы памяти


Дата добавления: 2015-07-09; просмотров: 930; Нарушение авторских прав


 

В языке С++ есть инструмент, позволяющий управлять ключевыми механизмами использования памяти и создавать мощные и гибкие программы. Этот инструмент - классы памяти. Каждая переменная принадлежит к одному из четырех классов памяти. Эти четыре класса памяти описываются следующими ключевыми словами:

 

auto - автоматическая,

extern - внешняя,

static - статическая,

register - регистровая.

 

Тип памяти указывается модификатором - ключевым словом, стоящим перед спецификацией типа переменной. Например,

 

static int sum;

register int p;

 

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

Автоматические переменные (auto) имеют локальную область действия. Они известны только внутри блока, в котором они определены. Автоматическая переменная создается (т.е. ей отводится место в памяти программы) при входе в

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

Автоматические переменные хранятся в оперативной памяти машины, точнее в стеке. Регистровые (register) переменные хранятся в регистрах процессора. Доступ к переменным, хранящимся в регистровой памяти, осуществляется гораздо быстрее, чем к тем, которые хранятся в оперативной памяти. В остальном регистровые переменные аналогичны автоматическим переменным. Регистровая память процессора невелика, и если доступных регистров нет, то переменная становится просто автоматической. Описание регистровой переменной имеет вид

 

register int c;

 

Внешняя переменная (extern) относится к глобальным переменным. Она может быть объявлена как вне, так и внутри тела функции.



 

void f (void)

{

extern int k; // объявление внешней переменной внутри

// функции

}

 

Появление ключевого слова extern связано с модульностью языка С++, т.е. возможностью создавать многофайловую программу с возможностью раздельной компиляции каждого файла. Когда мы в одном из файлов опишем вне тела функции глобальную переменную

 

float x;

 

то для нее выделится место в памяти, в разделе переменных и констант. Если мы используем эту глобальную переменную в текущем файле выше ее объявления или в другом файле, то при раздельной компиляции без дополнительного объявления переменной компилятор не будет знать, что это за переменная. Использование объявления

 

extern float x;

 

не приводит к выделению памяти, а сообщает компилятору, что такая переменная будет описана либо ниже в текущем файле, либо в другом файле.

 

Пример 6_4. Использование глобальной переменной.

#include "stdafx.h"

using namespace System;

 

extern int i;

 

void fun1(void);

int main()

{

i++;

fun1();

i++;

Console::WriteLine("В функции main() значение i = " + i);

Console::ReadLine();

return 0;

}

int i = 10; // объявление глобальной переменной

// здесь под переменную выделяется память

 

void fun1(void)

{

i++;

Console::WriteLine("\nВ функции fun1() значение i = " + i);

}

 

Результат работы программы:

В функции fun1() значение i = 12

В функции main() значение i = 13

 

 

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


Для подобных ситуаций в языке C++ существует оператор расширения области видимости (::). Будучи примененным к переменной в теле функции, он позволяет сослаться на глобальную переменную с указанным именем, даже если в самой функции объявлена одноименная локальная переменная. Синтаксис оператора таков:

::переменная

 

Пример 6_5. Использование оператора расширения области видимости.

#include "stdafx.h"

using namespace System;

 

extern int m;

void fun1(void);

 

int main()

{

int m=100;

fun1();

m++;

::m++;

Console::WriteLine("В функции main() значение локальной m = " + m);

Console::WriteLine("В функции main() значение глобальной m = " + ::m);

Console::ReadLine();

return 0;

}

 

int m = 10; // объявление глобальной переменной

// здесь под переменную выделяется память

 

void fun1(void)

{

m++;

Console::WriteLine("\nВ функции fun1() значение глобальной m = " + m);

}

 

Результат работы программы:

В функции fun1() значение глобальной m = 11

В функции main() значение локальной m = 101

В функции main() значение глобальной m=12

 

 

При описании статических переменных перед описанием типа ставится ключевое слово static. Область действия локальной статической переменной – вся программа. Место в памяти под локальные статические переменные выделяется в начале работы программы в разделе глобальных и статических переменных. Однако область видимости локальных статических переменных такая же, как и у автоматических. Значение статических переменных сохраняется от одного вызова функции до другого. Локальные статические переменные инициализируются нулем, если не указан другой инициализатор. При этом описание с инициализацией

 

static int d = 5;

 

локальной статической переменной d вызывает однократную инициализацию переменной d при выделении под нее места. При последующих вызовах функции, в которой описана эта переменная, инициализации не происходит.

 

 

Пример 6_6. Использование статической переменной.

#include "stdafx.h"

using namespace System;

 

void f(void);

int main()

{

int i;

for (i=1; i<=3; i++)

f();

Console::ReadLine();

return 0;

}

void f(void)

{

static int c = 10;

c++;

Console::WriteLine("\nВ функции f() значение c = " + c);

}

 

Результат работы программы:

В функции f() значение с = 11

В функции f() значение c = 12

В функции f() значение c = 13

 

Тестовые задания

ЗАДАНИЕ 1

Определите результат работы программы

void schet(int c, int d)

{

c+=3;

d+=10;

}

int main()

{

int x = 14, y=30;

schet( x, y);

Console::WriteLine("x={0}, y={1}", x, y);

return 0;

}

Варианты ответов

1. x=27, y=43

2. c=17, d=40

3. x=14, y=30

4. x=24, y=33

 

 

ЗАДАНИЕ 2

Определите результат работы программы

void schet (int m, int c)

{ m += 15;

c += 2;

}

 

int main()

{

int m = 10, c = 20;

schet(m, c);

Console::WriteLine("m={0}, c={1}", m, c);

return 0;

}

 

Варианты ответов

1. m=10, c=20

2. m=25, c=22

3. m=15, c=2;

4. m=27, c=37

 

 

ЗАДАНИЕ 3

Определите результат работы программы

void Schet(int k)

{

k += 10;

}

int main()

{

int k = 3;

for (int i=1; i<3; i++)

Schet(k);

k += 20;

Console::WriteLine("k={0}",k);

return 0;

}

 

Варианты ответов

1. k=43

2. k=3

3. k=23

4. k=53

 

 

ЗАДАНИЕ 4

Определите результат работы программы

extern int m;

void fun( int y)

{

m += 8;

y += 10;

}

int m = 10;

int main()

{ int b = 4;

m += 5;

fun( b);

Console::WriteLine(" b = " + b + " m = " + m);

return 0;

}

 

Варианты ответов

1. b=4 m=10

2. b=4 m=23

3. b=14 m=23

4. b=4 m=15

 

 

ЗАДАНИЕ 5

Определите результат работы программы

void fun()

{ static int y = 24;

y ++;

Console::Write(" y = " + y);

}

int main()

{ int c;

for ( c = 1; c <= 3; c++)

fun();

Console::ReadLine();

return 0;

}

 

 

Варианты ответов

1. y=24 y=24 y=24

2. y=25 y=26 d=27

3. y=24 y=25 y=26

4. y=25 y=25 y=25

 

 



<== предыдущая лекция | следующая лекция ==>
Область действия переменной | ГЛОССАРИЙ


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.035 сек.