В этой главе представлены основы работы с указателями. Сначала рассматриваются концепции, с которыми необходимо обязательно ознакомиться для работы с указателями, затем поясняется синтаксис указателей и некоторые причины их высокой популярности в С++.
Память в компьютере измеряется в байтах и битах. Вот текст программы, которая даст вам представление о том, чему равен размер переменных разных типов.
/* VariableSize — вывод информации о размерах переменных различных типов */
#include
#include
#include
using namespace std ;
int main( int nNumberofArgs , char* pszArgs[ ] )
{
bool b ;
char c ;
int n ;
long l ;
float f ;
double d ;
cout << "sizeof a bool = " << sizeof b << endl ;
cout << "sizeof a char = " << sizeof c << endl ;
cout << "sizeof an int = " << sizeof n << endl ;
_________________
105 стр. Глава 8. Первое знакомство с указателями в С++
cout << "sizeof a long = " << sizeof l << endl ;
cout << "sizeof a float = " << sizeof f << endl ;
cout << "sizeof a double= " << sizeof d << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Оператор sizeof представляет собой специальную инструкцию С++, которая возвращает размер своего аргумента в байтах. Вот как выглядит вывод данной программы, скомпилированной Dev-C++:

sizeof a bool = 1
sizeof a char = 1
sizeof an int = 4
sizeof a long = 4
sizeof a float = 4
sizeof a double= 8
Press any key to continue...

«He удивляйтесь, если при использовании другого компилятора вы получите другие результаты. Например, может оказаться, что размерint меньше размераlong . Стандарт С++ не оговаривает точные значения размера тех или иных типов — он говорит только о том, что размер типаint не превышает размераlong , а размерdouble не может быть меньше размераfloat . Размеры, приведённые выше, типичны для 32-битовых процессоров ( типа Pentium ).»
[ Советы ]
Очевидно, что каждая переменная С++ расположена где-то в памяти компьютера. Память разбита на байты, каждый из которых имеет свой адрес — 0, 1, 2 и т.д.
Переменная intRandy может находиться по адресу 0x100 , a floatReader — по адресу 0x180 ( адреса в памяти принято записывать в шестнадцатеричном виде ). Понятно, что эти переменные могут находиться где угодно, и только компьютер по долгу службы точно знает, где именно они располагаются — и то только в процессе выполнения программы.
Здесь можно провести определённую аналогию с отелем. Когда вы бронируете место, вам может быть предоставлен, например, номер 0x100 ( я понимаю, что номера в отеле никто не записывает в шестнадцатеричной форме, но отвлечёмся на минуту от этого факта ). Ваш друг при бронировании может оказаться в номере 0х180 — так и каждая переменная получает место в памяти при создании ( немного подробнее об этом будет рассказано далее, когда мы будем рассматривать область видимости ).
►Адресные операторы...106
В табл. 8.1 приведены два оператора, связанные с указателями. Оператор &по сути говорит "скажи мне номер комнаты в отеле", а *— "кто в этой комнате живёт".
_________________
106 стр. Часть 2. Становимся функциональными программистами
Таблица 8.1. Адресные операторы
_________________
Оператор — Описание
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
&— ( унарный ) Адрес
*— ( унарный ) ( В выражении ) то, на что указывает указатель
*— ( унарный ) ( В объявлении ) указатель на
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Следующая программа демонстрирует использование оператора & и показывает расположение переменных в памяти.
/* Layout — демонстрация расположения переменных в памяти компьютера */
#include
#include
#include
using namespace std ;
int main( int nNumberofArgs , char* pszArgs[ ] )
{
int end ;
int n ;
long l ;
float f ;
double d ;
/* Вывод в шестнадцатеричном формате */
cout.setf( ios::hex ) ;
cout.unsetf( ios::dec ) ;
/* Вывод адресов каждой из переменных. Обратите внимание на расположение переменных в памяти компьютера */
Читать дальше