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

 

Любой массив располагается в памяти, следовательно, имеет адрес в памяти. Указатели позволяют эффективно работать с массивами. Имя массива представляет собой скрытую форму указателя.

Если mas [10]- это массив, то имя массива mas это то же самое, что &mas[0] (masó&mas[0]) - это адрес 1-го элемента массива. Оба выражения являются константными выражениями и не меняются на протяжении работы программы. Их можно присваивать переменной типа указатель. Указатель на массив определяется так: тип*, например: int *pm; но чтобы указатель ссылался на массив, необходимо присвоить указателю адрес массива pm=mas;

int mas[10];

int *pm;

pm=mas;

 

Чтобы записать в память в нулевой элемент число 5, обращаемся к элементу массива через указатель: *pm=5; записать в третий элемент число 10: (pm+2)=10;

но можно и наоборот – считать содержимое элемента в какую-либо переменную, например: int y=*(pm+1); ó mas[1].

*pm+4 –к значению из нулевого элемента +4ж

*(pm+4) – обращение к 5-му элементу массива.

 

//пример программы

void main(void){

int dates [4], *pti, index;

float bills [4], *ptf;

pti=dates;

ptf=bills;

for (i=0; i<4; i++)

printf ("указатель +%d: %10u и %10u\n", i, pti+i; ptf+i);

}

Указатель +0: 56014 56026 - начало адреса массивов.

+1: 56016 56030

+2: 56018 56034

+3: 56020 56038

Единицей адресации является байт, но тип int использует два байта, а тип float – четыре. Что произойдет, если «прибавить единицу к указателю?» Компилятор языка СИ прибавит единицу памяти. Для массивов это означает, что мы перейдем к адресу следующего элемента массива, а не следующего байта. Вот почему, мы должны специально оговаривать тип объекта, на который ссылается указатель; одного адреса здесь не достаточно, так как машина должна знать, сколько байтов потребуется для запоминания объекта. (Это справедливо также для указателей на скалярные переменные; иными словами, при помощи операции *pt нельзя получить значение.)

Вывод: прибавляя 1 к указателю, переходим к следующему элементу массива, а не к следующему байту, т.е. смещаемся на длину типа элемента массива (int, float...).

рt pt+1 pt+2 pt+3

 


dates[0] dates[1] dates[2] dates[3]

dates+2<=>&dates[2]

*(dates+2) <=>dates[2]

*dates+2<=>*(dates)+2

 

//Суммирование элементов массива с использованием указателя.

for(i=0;i<10; i++)

sum+=*(ptm+i);

или

for(i=0;i<10; i++){

sum+=*ptm;

ptm++;

}

или

for(i=0;i<10; i++)

sum+=*ptm++;

 








Дата добавления: 2016-02-02; просмотров: 985;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.