Указатели и масиви. Указатели на едномерни масиви. Указатели на двумерни масиви
| Информационни технологии | 2009-12-04 | 210 сваляния |
15. Указатели и масиви. Указатели на едномерни масиви. Указатели на двумерни масиви.
В C++ има интересна и полезна връзка между указателите и масивите. Изразява се в това, че имената на масивите са указатели към техните първи елементи. Последното позволява указателите да се разглеждат като алтернативен начин за обхождане на елементите на даден масив.
Указатели и едномерни масиви
Нека a е масив, дефиниран по следния начин:
int a[100];
Тъй като a е указател към а[0], *a е стойността на a[0], т.е. *a и a[0] са два различни записа на стойността на първия елемент на масива. Тъй като елементите на масива са разположени последователно в паметта, a + 1 е адреса на a[1], a + 2 е адреса на a[2] и т.н. a + n-1 е адреса на a[n-1]. Тогава *(a+i) е друг запис на a[i] (i = 0, 1, ..., n-1).
Има обаче една особеност. Имената на масивите са константни указатели. Заради това, някои от аритметичните оператори, приложими над указатели, не могат да се приложат над масиви. Такива са ++, -- и присвояването на стойност.
Следващата програма показва два начина за извеждане на елементите на масив.
#include
int main()
{int a[] = {1, 2, 3, 4, 5, 6};
int i;
for (i = 0; i <= 5; i++)
cout << a[i] << 'n';
for (i = 0; i <= 5; i++)
cout << *(a+i) << 'n';
return 0;
}
Операторът
for (i = 0; i <= 5; i++)
{cout << *a << 'n';
a++;
}
съобщава за грешка заради a++ (a е константен указател и не може да бъде променян). Може да се поправи като се използва помощна променлива от тип указател към int, инициализирана с масива a, т.е.
int* p = a;
for (i = 0; i <= 5; i++)
{cout << *p << 'n';
p++;
}
Използването на указатели е по-бърз начин за достъп до елементите на масива и заради това се предпочита. Индексираните променливи правят кода по-ясен и разбираем. В процеса на компилация всички конструкции от вида a[i] се преобразуват в *(a+i), т.е. операторът за индексиране [] се обработва от компилатора чрез адресна аритметика. Полезно е да отбележим, че операторът [] е ляво-асоциативен и с по-висок приоритет от унарните оператори (в частност от оператора за извличане на съдържание *).
Указатели и двумерни масиви
Името на двумерен масив е константен указател към първия елемент на едномерен масив от константни указатели. Ще изясним с пример казаното.
Нека a е двумерен масив, дефиниран по следния начин:
int a[10][20];
Променливата a е константен указател към първия елемент на едномерния масив a[0], a[1], ..., a[9], като всяко a[i] е константен указател към a[i][0] (i = 0,1, ..., 9)
Задача 67. Да се напише програма, която въвежда по редове правоъгълна матрица Anxk от цели числа. Конструира матрица, образувана от редовете на A от четна позиция, след което я извежда като увеличава с 1 всеки неин елемент. Конструира матрица, образувана от редовете на A от нечетна позиция, след което я извежда като увеличава с 2 всеки неин елемент. И накрая, ако n е четно, извежда сумата на матриците от редовете от четните и нечетните позиции на A (без увеличенията с 1 и 2).
Програма Zad67.cpp решава задачата. Матрицата от редовете на А от четна позиция е конструирана в масива от указатели p, а матрицата от редовете на А от нечетна позиция е конструирана в масива от указатели q. Конструирането на масива p е реализирано чрез фрагмента:
int m = -1;
for (i = 0; i <= n-1; i = i+2)
{m++;
*(p+m) = *(a+i);
}
Стойността на p[0] е адреса на a[0][0], стойността на p[1] е адреса на a[2][0], стойността на p[2] е адреса на a[4][0] и т.н. Масивът q е конструиран по аналогичен начин, но стойността на q[0] е адреса на a[1][0], стойността на q[1] е адреса на
Тагове от реферата: указате, интересна, едномерни, двумерни











