Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Часть II. Становимся программистами
С не вызывает никаких проблем, поскольку C+ + известно, что указывает на целочисленную переменную и приводит 100. 0 перед присвое- нием к тому же типу.
Одним из путей использования указателей является передача аргументов функции. Для того чтобы понять всю важность этого метода, необходимо разобраться, как про- исходит передача аргументов функциям.
Передача аргументов по значению Вы мсгли заметить, что обычно нельзя изменить значение переменной, которая передавалась функции как аргумент. Рассмотрим следующий фрагмент кода: void { int = //здесь значение intArg равно } void { int 0; fn(nl); // здесь nl равно 0 } Функция paren t () инициализирует переменную nl нулем. После этого значение передается в качестве аргумента функции (). В f n () переменной intArg при- сваивается значение 10. тем самым в fn() осуществляется попытка изменить аргу- мент функции. Поскольку в качестве аргумента выступает переменная nl , можно ожидать, что после возврата в () эта переменная должна иметь значение 10. Тем не nl остается равной 0. Дело том, что C++ передает функции не переменную, а значение, которое в момент вызова функции находится в переменной. При вызове функции проис- ходит вычисление значения передаваемого функции выражения, даже если это просто переменная. Обычно, экономя слова, многие говорят что-то вроде "передаем перемен- "• самом деле это означает, что функции передается значение выражения х.
Передача значений указателей как и любая другая переменная, может быть передан функции в качест- ве аргумента. void pintArg} { 10;
void { int r. 0; Глава 8. Первое знакомство с указателями в C++ 93 //так передается адрес п // теперь п равно
В этом случае вместо значения п функции f n () передается адрес этой переменной. Чем отличается передача значения переменной от передачи значения указателя на менную, станет понятно, если рассмотреть присвоение, выполняющееся в функции (). Предположим, что п находится по адресу В этом случае функции () пе- редается аргумент, равный 0x102. Внутри fn () присвоение = 10 выполня- ет запись целого значения в переменную типа int , которая находится по адресу Таким образом, ноль в переменной л заменяется на 10, поскольку в данном случае 0x102 и есть адрес
Передача аргументов по ссылке В C++ возможна сокращенная запись приведенного выше фрагмента, которая не от программиста непосредственной работы с указателями. В приведенном ниже примере переменная п перелается по ссылке. При передаче по ссылке вместо значения переменной функции передается ссылка на переменную по сути, является синонимом слова адрес). void intArg) { intArg =
void i
}
int 0; fn // теперь значение п равно В этом примере функция frs () получает не значение переменной п, а ссылку на нее и, в свою очередь, записывает 10 в переменную типа int , на которую ссылается intArg.
Куна (heap) — это блок памяти изменяемого размера, который при необходимости может использоваться программой. Далее в этом разделе поясняется, зачем нужна ку- ча и как ею пользоваться. Очевидно, что если можно передать функции указатель, то можно и вернуть его как результат работы функции. Функция, которая должна вернуть некоторый адрес, объявляется следующим образом: double* При работе с возвращаемыми указателями следует быть очень осторожным. Чтобы понимать, чем чревато неаккуратное использование указателей, следует познакомить- ся с концепцией области видимости переменных (т.е. с тем, где именно от перемен- ных остается только видимость...).
Область видимости Кроме значения и типа, переменные в C++ имеют одно свойство — область видимости, т.е. часть программы, в которой эта переменная определена. Рассмотрим следующий фрагмент кода:
94 Часть //. Становимся программистами // эта переменная доступна для всех функций // и существует на протяжении всего // времени работы программы // область видимости) int
// переменная intChild доступна только в функции child // и существует во время выполнения // функции или вызываемой ею // (область видимости функции) void { int intChild;
// переменная имеет область видимости функции void (void) { in t intParen t = 0; () ;
in t intLate r = ; = intLater ;
int nArgs, char* {
) Программа начинает выполнять функцию main (). В первой же строке main () вы- зывает функцию paren t (). В этой функции выполняется объявление переменной intParent , которая имеет область видимости, ограниченную функцией. Такая пере- менная называется локальной и доступна только в этой функции. Во второй строке paren t О вызывается функция (). Эта функция также объявляет локальную переменную intChild , областью видимости которой являют- ся функция При этом intParen t функции () недоступна (и область видимости intParen t не распространяется на функцию chil d О), но сама перемен- ная продолжает существовать. После окончания работы функции () переменная intChil d выходит из об- ласти видимости и уничтожается, т.е. она не только недоступна, но и не существует (память, которую занимала эта переменная, возвращена в пул свободной памяти для дальнейшего использования). После возврата из функции () продолжается выполнение подпрограммы paren t (), и в следующей строке объявляется переменная intLater , которая имеет область видимости, ограниченную функцией (). В момент возврата в функ- цию () переменные intLate r и intParen t выходят из области видимости и уничтожаются. Кроме локальных переменных, программист может объявлять переменные вне всех функций. Такие переменные называются глобальными и доступны из любого места программы (их область видимости вся программа). Поскольку intGloba l в приведенном коде объявлена глобально, она доступна на протяжении работы всей программы и внутри любой из трех функций. Глава 8. Первое знакомство с указателями в C++ 95 |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 259; Нарушение авторского права страницы