
- •1 Основні відомості про вказівники
- •2. Вказівники та посилання
- •Void function_a (char*, int, short*);
- •Int *pi; /* вказівник-змінна на дані типу int */
- •3. Ініціалізація вказівника
- •4. Розіменування та присвоєння
- •5. Void-вказівник
- •6. Операція пересування вказівника
- •7. Використання вказівників з модифікатором const
- •8. Деактивації дії модифікатора
- •9. Подвійний вказівник
- •10. Вказівники і масиви
- •11. Доступ до ділянок динамічної пам'яті
- •12. Звільнення пам'яті
- •8. Операції з вказівниками
- •Int I, *pi; /* pi –змінна-вказівник */
- •13. Динамічні масиви
- •11. Посилання
- •Лабораторный практикум
- •Вопросы без ответов
- •3 Основні операції над вказівниками
- •4 Багаторівнева непряма адресація
- •5 Операції над вказівниками
- •Void main ()
- •Void main()
- •6 Проблеми, пов'язані з вказівниками
- •Int *х; /* змінній-покажчику 'х' виділена оп, але 'х' не містить значення адреси оп для змінної */
- •Int *х; /* х - ім'я покажчика, він одержав оп*/
- •Void main ()
- •9 Масиви
- •1.9.1 Основні поняття
- •Int а[5]; /* оголошення зовнішнього масиву */ main ()
- •9.2 Оголошення та звертання в одновимірних масивах
- •9.3 Оголошення та звертання до багатовимірних масивів
- •Int а[3][4]; /* а - вказівник-константа */
- •10 Масиви покажчиків
- •10.1 Робота з великими масивами
- •Void main()
- •Int *p[200], I, j; clrscr() ;
- •10.2 Вільні масиви та покажчики
- •11 Символьні рядки
- •11.1 Основні відомості про представлення рядків
- •11.2 Функції роботи з рядками
- •1. Функції введення рядків.
- •2. Функції виведення рядків.
- •14 Лекція №14
- •14.1 Вказівники Лекція № 2 - Вказівники та посилання
- •1.2.1. Вказівники
- •6. Вказівники і масиви
- •6.1. Вказівники і адреси
- •6.2. Вказівники і аргументи функцій
- •6.3. Вказівники і масиви
- •6.4. Адресна арифметика
- •6.5. Вказівники символів і функції
- •6.6. Вказівники – не цілі значення
- •6.7. Багатовимірні масиви
- •6.8. Масиви вказівників (вказівники на вказівники)
- •6.9. Ініціалізація масивів вказівників
- •6.10. Вказівники і багатовимірні масиви
- •6.11. Командний рядок аргументів
- •6.12. Вказівники на функції
- •Посібник для початківця про вказівники
- •6. Вказівники і структуровані програмні змінні
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •8. Вказівники і динамічні змінні (керування пам'яттю)
- •Void* operator new(size_t t)
- •Void operator delete(void* p)
- •Void main()
9 Масиви
1.9.1 Основні поняття
2. виділити ОП для його розміщення. У мові Сі можна використовувати масиви даних будь-якого типу:
• статичні: з виділенням ОП до початку виконання функції; ОП виділяється в стеку або в ОП для статичних даних;
• динамічні: ОП виділяється з купи в процесі виконання програми, за допомогою функцій malloc() і calloc().
Динамічні змінні використовують, якщо розмір масиву невідомий до початку роботи програми і визначається в процесі її виконання, наприклад за допомогою обчислення або введення.
Розмір масиву визначається:
1. для статичних масивів при його оголошенні; ОП виділяється до початку виконання програми; ім'я масиву - покажчик-константа; кількість елементів масиву визначається:
a. явно; наприклад: int а[5];
b. неявно, при ініціалізації елементів масиву; наприклад: int а[] = { 1, 2, 3 };
2. для динамічних масивів у процесі виконання програми; ОП для них запитується і виділяється динамічно, з купи; ім'я покажчика на масив - це змінна; масиви ці можуть бути:
a. одновимірні і багатовимірні; при цьому визначається кількість елементів усього масиву й ОП запитується для всього масиву;
b. вільні (спеціальні двовимірні); при цьому визначається кількість рядків і кількість елементів кожного рядка, і ОП запитується і виділяється для елементів кожного рядка масиву в процесі виконання програми; при використанні вільних масивів використовують масиви покажчиків;
Розмір масиву можна не вказувати. В цьому разі необхідно вказати порожні квадратні дужки:
1. якщо при оголошенні ініціалізується значення його елементів; наприклад:
static int а[] = {1, 2, 3}; char b[] = "Відповідь:";
2. для масивів - формальних параметрів функцій; наприклад:
int fun1(int a[], int n); int fun2(int b[k][m][n]);
3. при посиланні на раніше оголошений зовнішній масив; наприклад:
Int а[5]; /* оголошення зовнішнього масиву */ main ()
{
extern int а[];/*посилання на зовнішній масив */
}
В усіх оголошеннях масиву ім'я масиву - це покажчик-константа! Для формування динамічного масиву може використовуватися тільки ім'я покажчика на масив - це покажчик-змінна. Наприклад:
int *m1 = (int * ) malloc ( 100 * sizeof (int)) ;
float *m2 = (float * ) malloc ( 200 * sizeof (float)) ;
де ml - змінна-вказівник на масив 100 значень типу int;
m2 - змінна-вказівник на масив 200 значень типу float.
Звільнення виділеної ОП відбувається за допомогою функції:
free (вказівник-змінна) ;
Наприклад:
free(ml);
free(m2);
Звертання до елементів масивів ml і m2 може виглядати так: m1[i] , m2[j].
Пересилання масивів у Сі немає. Але можна переслати масиви поелементно або сумістити масиви в ОП, давши їм практично те саме ім'я.
Наприклад:
int *m1 = (int *) malloc(100 * sizeof(int));
int *m2 = (int *) malloc(100 * sizeof(int));
Для пересилання елементів одного масиву в іншій можна використати оператор циклу:
for (i = 0; i < 100; i++ ) m2[i] = ml [i] ;
Замість m2[i] = ml [i]; можна використовувати: *m2++ = *ml++; або: *(m2 + i) = *(ml + i) ;
За допомогою покажчиків можна сполучити обидва масиви й у такий спосіб:
free(m2); m2 = ml ;
Після цього обидва масиви займатимуть одну й ту саму область ОП, виділену для масиву ml. Однак це не завжди припустимо. Наприклад, коли масиви розташовані в різних типах ОП: один - у стеку, інший - у купі. Наприклад, у функції main() оголошені:
int *m1 = (int *) malloc(100* sizeof(int));
int m2 [100] ;
У вищенаведеному прикладі ml - пакажчик-змінна, і масив ml розташований у купі, m2 - покажчик-константа, і масив m2 розташований у стеку. У цьому випадку помилковий оператор: m2 = ml; тому що m2 - це покажчик-константа. Але після free(ml) припустимим є оператор:
ml = m2; /* оскільки ml - вказівник-змінна */
Для доступу до частин масивів і до елементів масивів використовується індексування (індекс). Індекс - це вираз, що визначає адресу значення або групи значень масиву, наприклад адреса значень чергового рядка двовимірного масиву. Індексування можна застосовувати до вказівників-змінних на одновимірний масив - так само, як і до вказівників-констант.
Індексний вираз обчислюється шляхом додавання адреси початку масиву з цілим значенням для одержання адреси необхідного елемента або частини масиву. Для одержання значення за індексним виразом до результату - адреси елемента масиву застосовується операція непрямої адресації (*), тобто одержання значення за заданою адресою. Відповідно до правил обчислення адреси цілочисельний вираз, що додається до адреси початку масиву, збільшується на розмір кванта ОП типу, що адресується вказівником.
Розглянемо способи оголошення і формування адрес частини масиву й елементів одновимірних і багатомірних масивів за допомогою вказівників.