
- •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()
Void main()
{
Int *p[200], I, j; clrscr() ;
randomize();
for (i=0;i<200;i++)
/* Запит ОП для рядків великого масиву: */
p[i] = (int*) malloc (300 * sizeof (int));
for (i = 0; i < 200; i++)
for (j = 0; j < 300; j++ )
{
*(p[i] + j ) = random(100);
printf("%3d", *(p[i] + j ));
if ( (j + 1) % 20 == 0 ) printf ("\n" );
}
/* Звільння ОП рядків великого масиву: */
for ( i=0; i < 200; i++ ) free( p[i] );
}
У програмі використовується р - масив покажчиків.
10.2 Вільні масиви та покажчики
Термін „вільний" масив відносять до двовимірних масивів. Вони можуть бути будь-якого типу, у тому числі int, float, char і типу структура. Вільний масив - це двовимірний масив, у якому довжини його рядків можуть бути різними. Для роботи з вільними масивами використовуються масиви вказівників, що містять в собі кількість елементів, рівну кількості рядків вільного масиву. Кожен елемент масиву покажчиків містить адресу початку рядка значень вільного масиву. ОП виділяється для кожного рядка вільного масиву, наприклад за допомогою функції malloc(), і звільняється функцією free(). Для того щоб виконати функцію malloc(), треба визначити кількість елементів у рядку, наприклад із вводу користувача або яким-небудь іншим способом. У нульовому елементі кожного рядка вільного масиву зберігається число, рівне кількості елементів даного рядка Дані в кожен рядок можуть вводитися з файлу або з клавіатури в режимі діалогу. Приклад вільного масиву цілих чисел приведений на рис 1.12:
j і |
Кількість 0 |
1 |
2 |
3 |
4 |
0 |
1 |
3 |
|
|
|
1 |
4 |
1 |
2 |
3 |
4 |
2 |
2 |
5 |
6 |
|
|
Рис. 12. Схема представлення вільного масиву цілих значень
У масиві на рис. 1.12 три рядки; у нульовому стовпці кожного рядка стоїть кількість елементів даного рядка. Далі - значення елементів матриці.
Приклад оголошення вільного масиву цілих, тобто статичного масиву покажчиків на дані типу int:
int *а[100];
Для масиву а приділяється ОП для 100 вказівників на значення цілого типу, по одному вказівнику на кожний з 100 рядків вільного масиву. Після визначення кількості елементів рядка для значень рядка повинна бути виділена ОП і сформоване значення вказівника в змінній a[i]. Цей вказівник посилається на область ОП, виділену для значень і-рядка матриці. Тільки після цього можна заносити в цю ОП значення елементів вільного масиву.
Реально ОП - це лінійна послідовність перенумерованих байтів. Елементи рядків вільного масиву можуть бути розташовані підряд або несуміжними відрізками ОП, виділеними для рядків.
11 Символьні рядки
11.1 Основні відомості про представлення рядків
Символьний рядок представляє собою набір з одного або більше символів.
Приклад: "Це рядок".
В мові Сі немає спеціального типу даних, який можна було б використовувати для опису рядків. Замість цього рядки представляються у вигляді масиву елементів типу char. Це означає, що символи рядка розташовуються в пам'яті в сусідніх комірках, по одному символу в комірці.
ц |
е |
|
р |
я |
д |
о |
к |
\0 |
Рис. 1.13. Представлення рядка у вигляді масиву символів
Необхідно відмітити, що останнім елементом масиву є символ '\0'. Це нульовий символ (байт, кожний біт якого рівний нулю). У мові Сі він використовується для того, щоб визначати кінець рядка.
Примітка. Нульовий символ - це не цифра 0; він не виводиться на друк і в таблиці символів ASCII (див. додаток) має номер 0. Наявність нульового символу передбачає, що кількість комірок масиву повинна бути принаймні на одну більше, ніж число символів, які необхідно розміщувати в пам'яті. Наприклад, оголошення
char str[10];
передбачає, що рядок містить може містити максимум 9 символів. Основні методи ініціалізації символьних рядків.
char str1[]= "ABCdef";
char str2[] = {'A', 'B' , 'C' , 'd' , 'e', 'f',0};
char str3[100]; gets(str3);
char str4[100]; scanf("%s",str4);
Усі константи-рядки в тексті програми, навіть ідентично записані, розміщуються за різними адресами в статичній пам'яті. З кожним рядком пов'язується сталий вказівник на його перший символ. Власне, рядок-константа є виразом типу „вказівник на char" зі сталим значенням - адресою першого символу.
Так, присвоювання p="ABC" (p - вказівник на char) встановлює вказівник p на символ 'A'; значенням виразу *("ABC"+1) є символ 'B'.
Елементи рядків доступні через вказівники на них, тому будь-який вираз типу „вказівник на char" можна вважати рядком.
Необхідно мати також на увазі те, що рядок вигляду „х" - не те ж саме, що символ 'x'. Перша відмінність : 'x' - об'єкт одного з основних типів даних мови Сі (char), в той час, як „х" - об'єкт похідного типу (масиву елементів типу char). Друга різниця : „х" насправді складається з двох символів - символу ' x' і нуль-символу.
X |
|
X |
\0 |
Рис. 14. Різниця між представленням 'x' та "x"