Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
upper = 0
n = 0
lower = 0
Сохранение double в int
upper = 1076494336
n = 0
lower = 0
Press any key to continue...
На языке домов и адресов эта программа будет выглядеть так:
house* houseAddress = & "123 Main Street" ;
hotel* hotelAddress ;
hotelAddress = ( hotel* )houseAddress ;
*hotelAddress = TheRitz ;
Указатель houseAddress инициализирован как указатель на мой дом. Переменная hotelAddress содержит адрес отеля. После этого вместо адреса моего дома записывается адрес отеля. Затем отель "Ритц" устанавливается по адресу моего дома. Однако поскольку "Ритц" куда больше моего дома, не удивительно, что он уничтожит не только мой дом, но и дома моих соседей ( хоть что-то приятное в результате ошибки! ).
Типизация указателей предохраняет программиста от неприятностей, связанных с сохранением данных большего размера в меньшем объёме памяти. Присвоение *pintVar = 100.0 не вызывает никаких проблем, поскольку С++ известно, что pintVar указывает на целочисленную переменную и приводит 100.0 перед присвоением к тому же типу.
►Передача указателей функциям...111
Одним из путей использования указателей является передача аргументов функции. Для того чтобы понять всю важность этого метода, необходимо разобраться, как происходит передача аргументов функциям.
_________________
111 стр. Глава 8. Первое знакомство с указателями в С++
Передача аргументов по значению...112
Вы могли заметить, что обычно нельзя изменить значение переменной, которая передавалась функции как аргумент. Рассмотрим следующий фрагмент кода:
void fn( intArg )
{
int intArg = 10 ;
/* Здесь значение intArg равно 10 */
}
void parent( void )
{
int n1 = 0 ;
fn( n1 ) ;
/* Здесь n1 равно 0 */
}
Функция parent( ) инициализирует переменную n1 нулём. После этого значение n1 передаётся в качестве аргумента функции fn( ) . В fn( ) переменной intArg присваивается значение 10 , тем самым в fn( ) осуществляется попытка изменить аргумент функции. Поскольку в качестве аргумента выступает переменная n1 , можно ожидать, что после возврата в parent( ) эта переменная должна иметь значение 10. Тем не менее n1 остаётся равной 0.
Дело в том, что С++ передаёт функции не переменную, а значение, которое в момент вызова функции находится в переменной. При вызове функции происходит вычисление значения передаваемого функции выражения, даже если это просто переменная.
«Некоторые программисты, стараясь не быть многословными, говорят что-то вроде "передаём переменнуюх функцииfn( ) ". На самом деле это означает, что функцииfn( ) передаётся значение выражениях .»
[ Атас! ]
Передача значений указателей...112
Указатель, как и любая другая переменная, может быть передан функции в качестве аргумента.
void fn( int* pintArg)
{
*pintArg = 10 ;
}
void parent( void )
{
int n = 0 ;
fn( & n ) ; /* Так передаётся адрес n */
/* теперь n равно 10 */
}
В этом случае вместо значения n функции fn( ) передаётся адрес этой переменной. Чем отличается передача значения переменной от передачи значения указателя на переменную, станет понятно, если рассмотреть присвоение, выполняющееся в функции fn( ) .
Предположим, что n находится по адресу 0x102. В этом случае функции fn( ) передаётся аргумент, равный 0x102. Внутри fn( ) присвоение *pintArg = 10 выполняет запись целого значения 10 в переменную типа int , которая находится по адресу 0x102. Таким образом, нуль в переменной n заменяется на 10 , поскольку в данном случае 0x102 и есть адрес переменной n .
_________________
112 стр. Часть 2. Становимся функциональными программистами
Передача аргументов по ссылке...113
В С++ возможна сокращённая запись приведённого выше фрагмента, которая не требует от программиста непосредственной работы с указателями. В представленном ниже примере переменная n передаётся по ссылке .
void fn( int & intArg )
{
intArg = 10 ;
}
void parent( void )
{
int n = 0 ;
fn ( n )
/* Теперь значение n равно 10 */
}
В этом примере функция fn( ) получает не значение переменной n , а ссылку на неё и, в свою очередь, записывает 10 в переменную типа int , на которую ссылается intArg .
►Использование кучи...113
Куча ( heap ) — это блок памяти изменяемого размера, который при необходимости может использоваться программой. Далее в этом разделе поясняется, зачем нужна куча и как ею пользоваться.
«Visual С++ .NET позволяет программисту писать код, который работает в т.н. управляемом режиме ( managed mode ), когда выделение и освобождение памяти обрабатывает компилятор. Поскольку таким режимом отличается толькоVisual С++ .NET , в данной книге он не рассматривается.»
[ Атас! ]
Очевидно, что если можно передать функции указатель, то можно и вернуть его как результат работы функции. Функция, которая должна вернуть некоторый адрес, объявляется следующим образом:
double* fn( void ) ;
При работе с возвращаемыми указателями следует быть очень осторожным. Чтобы понимать, чем чревато неаккуратное использование указателей, следует познакомиться с концепцией области видимости переменных ( т.е. с тем, где именно от переменных остаётся только видимость... ).
Область видимости...113
Кроме значения и типа, переменные в С++ имеют ещё одно свойство — область видимости, т.е. часть программы, в которой эта переменная определена. Рассмотрим следующий фрагмент кода:
/* Эта переменная доступна для всех функций и существует на протяжении всего времени работы программы ( глобальная область видимости ) */
int intGlobal ;
/* Переменная intChild доступна только в функции child( ) и существует только во время выполнения функции child( ) или вызываемой ею ( область видимости функции ) */
_________________
113 стр. Глава 8. Первое знакомство с указателями в С++
void child( void )
{
int intChild ;
}
/* Переменная intParent имеет область видимости функции */
Читать дальшеИнтервал:
Закладка: