Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 28-29.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
61.95 Кб
Скачать

Вказівники і масиви

Вказівники і масиви дуже схожі. Зокрема, доступ до елементів масиву можна одержати як за допомогою індексів, так і за допомогою вказівників.

#include<iostream>

using namespace std;

int main()

{int intarray[5]={31, 54, 77, 52, 93};

for(int j=0; j<5; j++)

cout<<*(intarray+j)<<endl;

return 0;

}

Результат дії виразу *(intarray+j) – такий сам, як і виразу intarry[j], при цьому результат роботи однаковий. Ім’я масиву є його адресою, запис типу (intarray+3) означає адресу четвертого елементу масиву (оскільки нумерація починається з нуля), а запис *(intarray+3) – значення, записане за цією адресою

Вказівники-константи і вказівники-змінні

Припустимо, що ми хочемо використати операцію збільшення замість додавання кроку j до імені intarray. Чи можна записати *(intarray++)?

Зробити так не можна, оскільки не можна змінювати константи. Вираз intarray є адресою в пам’яті, де наш масив буде зберігатися до завершення роботи програми, тому intarray – це вказівник константи. Написати intarray++ неможливо, так само, як неможливим є запис 7++.

Ми не можемо збільшувати адресу, але можемо збільшувати вказівник, який містить цю адресу. Далі приведена програма, яка показує, як це робиться.

#include<iostream>

using namespace std;

int main()

{int intarray[5]={31, 54, 77, 52, 93};

int* ptrint;

ptrint=intarry;

for(int j=0; j<5; j++)

cout<<*(ptrint++)<<endl;

return 0;

}

Тут ми визначили вказівник на int - ptrint – і присвоїли йому значення адреси масиву intarray. Тепер ми можемо дістати доступ до елементів масиву, використовуючи вираз:

*(ptrint++)

Керування пам’яттю: операції new I delete

Ми розглянули багато прикладів, в яких масиви використовувалися без врахування розміру пам’яті. В рядку

int arr1[100];

зарезервована пам’ять до 100 елементів типу int. Масиви є серйозним підходом до зберігання даних, але вони мають один недолік: ми повинні знати принаписанні програми, наскільки великий масив нам потрібен. Ми не можемо ввести розмір масиву в ході роботи програми. Наступний підхід працювати не буде:

cin>>size;

int arr[size];

Компілятор вимагає, щоб значення розміру масиву було константою.

Але в багатьох ситуаціях нам невідома потрібна кількість пам’яті до запуску програми. В такій ситуації ми можемо визначити розмір масиву більшим, що призведе до перевитрати пам’яті.

Операція new

C++ пропонує інший підхід до виділення памєєяті – операцію new. Це універсальна операція, яка одержує пам’ять в операційної системи і повертає вказівник на початок виділеного блоку. В програмі, приведеній далі, показано, як це працює.

#include<iostream>

#include<string>

using namespace std;

int main()

{char* str=”abcd efgh ijklm n”;

int len=strlen(str);

char* ptr;

ptr=new char[len+1];

strcpy(ptr,str);

cout<<”ptr=”<<ptr<<endl;

delete[] ptr;

return 0;

}

Вираз

ptr=new char[len+1];

присвоює змінній ptr значення адреси блоку памєєяті, достатнього для зберігання рядка str, довжину якої можна одержати, використовуючи бібліотечну функцію strlen() плюс один символ для символа кінця рядка. Натомість функція strcpy() копіює рядок str у вказану ділянку пам’яті, на яку вказує вказівник ptr. Рядок повністю займає цю ділянку пам’яті, оскільки його розмір рівний довжині рядка str.