Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

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






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




Указатель – это переменная, которая содержит адрес переменной. Так как указатель – это адрес некоторого объекта, то через него можно обращаться к данному объекту.

В СИ существует тесная связь между указателями и массивами. Любой доступ к элементу массива, осуществляемый операцией индексирования, может быть выполнен при помощи указателя.

Декларация

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 на единицу, вследствие чего на экран после нулевого элемента выводится второй, и затем четвертый.

 

 


mylektsii.ru - Мои Лекции - 2015-2019 год. (0.01 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал