Указатели на одномерные массивы
Любой массив располагается в памяти, следовательно, имеет адрес в памяти. Указатели позволяют эффективно работать с массивами. Имя массива представляет собой скрытую форму указателя.
Если 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; просмотров: 990;