Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Часть 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; Просмотров: 230; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.024 с.)
Главная | Случайная страница | Обратная связь