![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Указатели и одномерные массивы
Указатель – это переменная, которая содержит адрес переменной. Так как указатель – это адрес некоторого объекта, то через него можно обращаться к данному объекту. В СИ существует тесная связь между указателями и массивами. Любой доступ к элементу массива, осуществляемый операцией индексирования, может быть выполнен при помощи указателя. Декларация int a[10]; определяет массив а размера 10, т.е. блок из десяти последовательных объектов, представленных на рисунке, с именами a[0], a[1], …, a[9].
Запись a[i] отсылает нас к i-му элементу массива. Если ра есть указатель, т.е. определен как int *pa;, то в результате присваивания pa = & a[0]; pa будет указывать на нулевой элемент массива а; иначе говоря, ра будет содержать адрес элемента a[0] (см. рис.). Теперь присваивание x=*pa; будет копировать содержимое а[0] в х. Если ра указывает на некоторый элемент массива, то ра+1 по определению указывает на следующий элемент (см. рис.).Таким образом, если ра указывает на a[0], то *(ра+1) есть содержимое a[1], ра+1 – адрес a[1], *(ра+i) – содержимое a[i]. Поскольку имя массива есть не что иное как адрес его начального элемента, присваивание pa=& a[0]; можно также записать в следующем виде: pa = a; Так как ра – указатель, то в выражениях его можно использовать с индексом, то есть запись pa[i] эквивалентна записи *(pa+i). Элемент массива одинаково разрешается изображать и в виде указателя со смещением, и в виде имени массива с индексом. Между именем массива и указателем, выступающим в роли имени массива, существует одно различие. Указатель – это переменная, поэтому можно написать pa=a или pa++. Но имя массива не является переменной, и запись типа a=pa не допускается. Следует также различать выражения *(a+2) и *a+2: *(а+2) – значение третьего элемента массива а; *а+2 – добавление числа 2 к значению первого элемента массива.
Пример 4.1. Вывести значения одномерного массива обычным способом и с использованием указателей. Фрагмент программы: /*объявление и инициализация массива*/ int a[6]={10, 20, 30, 40, 50, 60}; int i, *p; /*вывод массива обычным способом*/ for (i=0; i< 6; i++) Label1-> Caption=Label1-> Caption+IntToStr(a[i])+" "; p=a; /*вывод массива с использованием указателя*/ for (p=& a[0]; p< =& a[5]; p++) Label2-> Caption=Label2-> Caption+IntToStr(*p)+" "; /*еще один вариант с использованием указателя*/ for (p=& a[0], i=0; i< 6; i++) Label3-> Caption=Label3-> Caption+IntToStr(p[i])+" "; Дадим еще некоторые пояснения. Операция р++ увеличивает значение указателя на единицу. Если p=& a[i], то после операции р++ в р содержится адрес элемента a[i+1]. Пример 4.2. Найти среднее арифметическое массива, состоящего из шести элементов, с использованием указателя. int a[6]={10, 20, 30, 40, 50, 60}; int i, *p; float s; p=a; /*указатель получает значение адреса нулевого элемента массива*/ for (s=0, i=0; i< 6; i++) s+=*(p+i); /*получение суммы элементов массива*/ s=s/6; /*среднее арифметическое массива*/ Label1-> Caption=Label1-> Caption+FloatToStr(s)+" "; Пример 4.3. Задан одномерный массив S, состоящий из десяти элементов вещественного типа. Вывести значения элементов этого массива в обратном порядке. Операция р++ увеличивает значение указателя на единицу. Если p=& a[i], то после операции р++ в р содержится адрес элемента a[i+1].
{int s[10]; int *p, i; randomize(); /*заполнение массива случайными числами*/ for (i=0; i< 10; i++) StringGrid1-> Cells[i][0]=IntToStr(rand () % 99 - 25); /*вывод элементов массива*/ for (i=0; i< 10; i++) s[i]=StrToInt(StringGrid1-> Cells[i][0]); p=& s[9]; /*указатель получает значение адреса последнего элемента массива*/ /*вывод элементов в обратном порядке*/ for (i=0; i< 10; i++) StringGrid2-> Cells[i][0]=*(p-i); /* вывод элементов в обратном порядке другим способом */ for (i=0, p=& s[9]; p> =& s[0]; p--, i++) StringGrid3-> Cells[i][0]= *p; } Пример 4.4. Вывести на экран значения нулевого, второго и четвертого элементов массива. { /*объявление и инициализация массива а*/ int a[]={10, 20, 30, 40, 50, 60}; int *p, i; /*вывод значений нулевого, второго и четвертого элементов*/ for (p=a, i=0; p+i< =a+4; p++, i++) Label1-> Caption= Label1-> Caption + *(p+i) + " "; } В цикле происходит одновременное увеличение указателя р и индекса i на единицу, вследствие чего на экран после нулевого элемента выводится второй, и затем четвертый.
|