|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Указатели и адреса. Указатели и массивыИдея указателей несложна. Начать нужно с того, что каждый байт памяти компьютера имеет адрес. Адреса — это те же числа, которые мы используем для домов на улице. Числа начинаются с 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.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |