АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Указатели и адреса. Указатели и массивы

Читайте также:
  1. Библиографические указатели, каталоги и картотеки
  2. О результатах рассмотрения жалобы просим (прошу) сообщить в наши (в мой) адреса.
  3. О результатах рассмотрения жалобы просим (прошу)сообщить в наши ( в мой) адреса.
  4. Ответ на обращение просим направить в наши адреса.
  5. Тема 4. Массивы. Разработка программ с использованием одномерных и двумерных массивов.
  6. Указатели
  7. Указатели
  8. Указатели и функции. Указатели на объекты. Указатели и функции
  9. Указатели на функции
  10. Указатели файлов (текущая позиция). Функции для работы с указателями файлов.
  11. Указатели, как и любые другие переменные, должны быть объявлены, прежде чем они будут использоваться. В операторе

Идея указателей несложна. Начать нужно с того, что каждый байт памяти компьютера имеет адрес. Адреса — это те же числа, которые мы используем для домов на улице. Числа начинаются с 0, а затем возрастают — 1, 2, 3 и т. д. Если у нас есть 1 Мбайт памяти, то наибольшим адресом будет число 1 048 575 (хотя обычно памяти много больше).

Загружаясь в память, наша программа занимает некоторое количество этих адресов. Это означает, что каждая переменная и каждая функция нашей программы начинается с какого-либо конкретного адреса. На рис. 10.1 показано, как это выглядит.

 

Указатели и массивы

 

Указатели и массивы очень похожи. как можно получить доступ к элементам массива. Вспомним это на приме- ре ARRNOTE:

// arrnote.cpp

// обычный доступ к элементам массива

#include <iostream>

using namespace std;

int main ( )

{

int intarray [ 5 ] = { 31, 54, 77, 52, 93 }; // набор целых чисел

for ( int j = 0; j < 5; j++ ) // для каждого элемента массива

cout << intarray [ j ] << endl; // напечатаем его значение

return 0;

}

Функция cout выводит элементы массива по очереди. Например, при j, рав- ном 3, выражение intarray [j] принимает значение intarray[3], получая доступ к четвертому элементу массива, числу 52. Рассмотрим результат работы програм- мы ARRNOTE:

31 54 77 52 93

Необычно то, что доступ к элементам массива можно получить как исполь- зуя операции с массивами, так и используя указатели. Следующий пример PTRNOTE похож на пример ARRNOTE, за исключением того, что в нем используют- ся указатели.

// ptrnote.cpp

// доступ к элементам массива через указатель

#include <iostream>

using namespace std;

int main ( )

{

int intarray [ 5 ] = { 31, 54, 77, 52, 93 }; // набор целых чисел

for ( int j = 0; j < 5; j++ ) // для каждого элемента массива

cout << *( intarray + j ) << endl; // напечатаем его значение

return 0;

}

Результат действия выражения * (intarray+j) — тот же, что и выражения intarray[j] в программе ARRNOTE, при этом результат работы программ одинаков. Что же представляет из себя выражение *(intarray+j)? Допустим, j равно 3, тогда это выражение превратится в *(intarray+3). Мы предполагаем, что оно содержит в себе значение четвертого элемента массива (52). Вспомним, что имя массива является его адресом. Таким образом, выражение intarray+j — это адрес чего-то в массиве. Вы можете ожидать, что intarray+З будет означать 3 байта массива intarray. Но это не даст нам результат, который мы хотим получить: intarray — это массив элементов типа int, и три байта в этом массиве — середина второго элемента, что не очень полезно для нас.



Мы хотим получить четвертый элемент массива, а не его четвертый байт, что показано на рис. 10.5 (на этом рисунке int занимает 2 байта).

 

Компилятору C++ достаточно получить размер данных в счетчике для вы- полнения вычислений с адресами данных. Ему известно, что intarray — массив типа int. Поэтому, видя выражение intarray+3, компилятор интерпретирует его как адрес четвертого элемента массива, а не четвертого байта.

Но нам необходимо значение четвертого элемента, а не его адрес. Для его по- лучения мы используем операцию разыменования (*). Поэтому результатом вы- ражения *(intarray+3) будет значение четвертого элемента массива, то есть 52.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |


При использовании материала, поставите ссылку на Студалл.Орг (0.004 сек.)