Память компьютера можно рассматривать как последовательный набор ячеек памяти. Каждая ячейка памяти компьютера имеет свой номер, называемый адресом. Обычно первый адрес памяти имеет номер 0. В большинстве компьютерных систем ячейка занимает 1 байт.
Компьютер использует память для хранения команд программы и хранения значений переменных, связанных с программой.
Например, если мы объявим переменную с именем count типа int, то система выделит ячейки в памяти, чтобы сохранять значение count во время выполнения программы. Это может быть, например адрес 1000FF16 в памяти компьютера.
К счастью, нам не нужно думать о конкретных адресах памяти, связанных с переменными, поскольку система делает это автоматически. Однако знание того, что каждая переменная связана со своим адресом в памяти, помогает понять, как действуют указатели.
Когда мы применяем адресный оператор & к переменной в Objective-C, генерируемое значение — это конкретный адрес данной переменной в памяти компьютера. Именно поэтому мы называем этот оператор адресным. Например, оператор:
1 |
intPtr = &count; |
присваивает указателю intPtr адрес в памяти компьютера, который был выделен для переменной count. Так, если count размещена по адресу 1000FF6, этот оператор присвоит указателю intPtr значение 0x1000FF.
Применение оператора косвенного доступа * к переменной-указателю, как в выражении:
1 |
*intPtr |
означает интерпретацию значения, содержащегося в этой переменной, как адреса памяти. Значение, хранящееся по этому адресу, считывается и интерпретируется в соответствии с типом, объявленным для этой переменной.
Например, если переменная intPtr является указателем на тип int, то система будет интерпретировать значение, хранящееся по адресу памяти, заданному с помощью *intPtr, как целое значение.