В этой главе представлены основы работы с указателями. Сначала рассматриваются концепции, с которыми необходимо обязательно ознакомиться для работы с указателями, затем поясняется синтаксис указателей и некоторые причины их высокой популярности в С++.
►Размер переменной...105
Память в компьютере измеряется в байтах и битах. Вот текст программы, которая даст вам представление о том, чему равен размер переменных разных типов.
/* VariableSize — вывод информации о размерах переменных различных типов */
#include <cstdio>
#include <cstdlib>
#include <iostream>
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 ).»
[Советы]
►Что такое адрес...106
Очевидно, что каждая переменная С++ расположена где-то в памяти компьютера. Память разбита на байты, каждый из которых имеет свой адрес — 0, 1, 2 и т.д.
Переменная intRandy может находиться по адресу 0x100 , a floatReader — по адресу 0x180 ( адреса в памяти принято записывать в шестнадцатеричном виде ). Понятно, что эти переменные могут находиться где угодно, и только компьютер по долгу службы точно знает, где именно они располагаются — и то только в процессе выполнения программы.
Здесь можно провести определённую аналогию с отелем. Когда вы бронируете место, вам может быть предоставлен, например, номер 0x100 ( я понимаю, что номера в отеле никто не записывает в шестнадцатеричной форме, но отвлечёмся на минуту от этого факта ). Ваш друг при бронировании может оказаться в номере 0х180 — так и каждая переменная получает место в памяти при создании ( немного подробнее об этом будет рассказано далее, когда мы будем рассматривать область видимости ).
►Адресные операторы...106
В табл. 8.1 приведены два оператора, связанные с указателями. Оператор & по сути говорит "скажи мне номер комнаты в отеле", а * — "кто в этой комнате живёт".
_________________
106 стр. Часть 2. Становимся функциональными программистами
Таблица 8.1. Адресные операторы
_________________
Оператор — Описание
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
& — ( унарный ) Адрес
* — ( унарный ) ( В выражении ) то, на что указывает указатель
* — ( унарный ) ( В объявлении ) указатель на
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯