Разграничение контекстов
Области действия имен
Механизм передачи значения
В некоторых источниках можно встретить утверждение о том, что для параметра-константы, как и для параметра-переменной, не создается копии в момент вызова подпрограммы. Однако выполнение простейшей проверки
var a: byte;
procedure prob(const c:byte);
begin
writeln(longint(addr(c))); {физ.адрес параметра с}
end;
begin
a:=0;
writeln(longint(addr(a))); {физ.адрес переменной а}
prob(a);
end.
доказывает обратное: физические адреса переменной а и параметра с различаются. Следовательно, в памяти эти переменные занимают разные позиции, а не одну, как было бы в случае параметра-переменной. Вы можете убедиться в этом самостоятельно, запустив данную программу в трех разных вариантах (для параметра-значения, параметра-переменной и параметра-константы ), а затем сравнив результаты.
Глобальные объекты - это типы данных, константы и переменные, объявленные в начале программы до объявления любых подпрограмм. Эти объекты будут видны во всей программе, в том числе и во всех ее подпрограммах. Глобальные объекты существуют на протяжении всего времени работы программы.
Локальные объекты объявляются внутри какой-нибудь подпрограммы и "видны" только этой подпрограмме и тем подпрограммам, которые были объявлены как внутренние для нее. Локальные объекты не существуют, пока не вызвана подпрограмма, в которой они объявлены, а также после завершения ее работы.
Таблица 8.1. Пример разграничения контекстов
program prog; var a:byte; |
procedure pr1 (p:byte); var b:byte; (первый уровень вложенности) |
function f (pp:byte); var c:byte; (второй уровень вложенности) begin (здесь "видны" переменные a, b, c, p, pp) end; |
begin (здесь "видны" переменные a, b, p) end; |
var g:byte |
procedure pr2; var d:byte; (первый уровень вложенности) begin (здесь видны переменные a, d, g) end; |
begin (тело программы; здесь "видны" переменные a, g) end; |