Лабораторная работа № 7 Указатели и массивы
Цель работы – овладеть практическими навыками работы с указателями и динамическими массивами..
Для вывода на дисплей адреса, который хранит указатель, используем спецификатор %u в функции printf. С помощью этой функции можно вывести адреса, по которым лежат переменные:
printf("i = %p\n", &i);
массивы (имя массива есть указатель на его начальный элемент):
printf("Ar = %p\n", Ar);
и т.д. С помощью указателя можно обращаться к элементам масисва:
*(Ar + k).
Пример 1. Заполнить статический массив последовательностью чисел с использованием указателя:
#define N 20 // размер массива
int main(int argc, char* argv[])
{
int Ar[N];
short i, j; // текущие индексы
int k;
printf("i = %p\n", &i); // Адреса переменных
printf("j = %p\n", &j);
printf("k = %p\n", &k);
printf("Ar = %p\n", Ar); // Адрес массива
for (i = 0; i < N; i++) // Заполнение массива данными
*(Ar + i) = i+1;
for (i = 0; i < N; i++)
printf("%3d",Ar[i]); // Обращение к элементу массива по индексам
printf("\n");
for (k = 0; k < N; k++)
printf("%3d", *(Ar + k)); // Обращение к элементу массива по указателю,
printf("\n");
getch();
return 0;
}
Результат работы программы:
Адреса переменных и массива лежат рядом. Обращение к элементам массива по индексу или через указатель совершенно эквивалентны.
Пример 2. Создать и заполнить динамический массив последовательностью чисел с использованием указателя:
#define N 20 // размер массива
Int main(int argc, char* argv[])
{
int *DAr;
short i, j; // текущие индексы
int k;
DAr = new int[N];
printf(" DAr = %p \n", DAr);
for (i = 0; i < N; i++) // перебор строк
*( DAr + i) = i+1;
for (i = 0; i < N; i++)
printf("%3d", DAr[i]); // Обращение к элементу массива по индексам
for (k = 0; k < N; k++)
printf("%3d", *(DAr + k)); // Обращение к элементу массива по указателю,
printf("\n");
delete[] DAr;
getch();
return 0;
}
Результат работы программы:
Адреса переменных и указателя лежат рядом. Адрес массива сильно отличается, т.к. для массива память выделялась динамически с помощью оператора new в так называемой динамической памяти. Указатель Darr и хранит адрес начала выделенной памяти. Обращение к элементам массива по индексу или через указатель совершенно эквивалентны, так же как и для статического массива.
Для двумерных массивов есть существенный отличия. В статическом массиве все строки расположены в памяти подряд, поэтому обращение к элементам массива по индексам или через указатель совершенно эквивалентны. В динамическом массиве сначала выделяется память для массива указателей на строки, а затем для каждой строки. Поэтому ячейки могут идти не подряд.
Пример 3. Заполнить двумерный статический массив, а также создать и заполнить дву-мерный динамический массив последовательностью чисел с использованием указателя:
#define N 5 // размер массива
//---------------------------------------------------------------------------