
- •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 function_a (char*, int, short*);
Нижче наведено приклади деяких можливих оголошень вказівників:
Int *pi; /* вказівник-змінна на дані типу int */
float *pf; /* вказівник-змінна на дані типу float */
Зверніть увагу на те, що у трьох з наведених оголошень ім'я масиву є константою-вказівником!
3. Ініціалізація вказівника
Подібно до звичайної змінної перед першим використанням вказівник потребує ініціалізації.
Ініціалізація вказівника - це присвоєння йому адреси існуючої комірки пам’яті або щойно виділеної. До ініціалізації він містить довільне випадкове значення, яке може бути наслідком попередньої операції.
Ініціалізація вказівника адресою може бути здійснена як безпосередньо при його оголошенні (див. загальний синтаксис) так і в процесі виконання програми (пізня ініціалізація):
int i=3;
int *j=&i; //рання ініціалізація
int *j;
j=&i; //пізня ініціалізація
Способи ініціалізації вказівника:
1) Присвоювання вказівнику адреси існуючого об'єкта:
а) за допомогою операції одержання адреси
int x=7; //ціла змінна x
int *px=&x // у вказівник заноситься адреса змінної x
Знак амперсанд (&) слід розуміти як адресу конкретної області пам'яті, для вказівника на змінну цей знак означає, що буде одержана саме адреса змінної у пам'яті, а не значення самої змінної. Таким чином, у цьому прикладі, у px зберігається адреса змінної x, тому px тепер вказує на x.
Тепер, якщо потрібно звернутися за адресою змінної x, можна використовувати px. Для такого звертання слід написати *px. Кажуть, що оператор (*) розіменовує вказівник.
б) за допомогою значення іншого (ініціалізованого) вказівника
int *z=px;
в) за допомогою імені масиву або функції (вони трактуються як адреса).
int y[20]; //масив y
int *py=y; //у вказівник py заноситься адреса початку масиву y.
2) Присвоювання адреси області пам'яті в явному вигляді.
int* v=(int*)0x800000;
3) Присвоювання порожнього значення.
int *s=NULL;
4. Розіменування та присвоєння
Як тільки оголошено вказівник j, можливий доступ до даних за адресою, що міститься в j, шляхом операції розіменування вказівника (операції доступу до значення, яке знаходиться в пам'яті за адресою на яку посилається вказівник)
Приклад 1
#include <stdio.h> // Потокове введення-виведення
#include <windows.h>
int main()
{
int i=3;
int *j=&i;
printf ("%d\n",i); // i = 3
*j=2; // змінити значення на яке посилається вказівник
printf ("%d\n",i); // i = 2
system("pause");
}
Скомпілюйте наведений приклад.
Приклад 2
#include <stdio.h> // Потокове введення-виведення
#include <windows.h>
int main()
{
int i=3;
float *j=&i;
printf ("%d\n",i); // i = 3
*j=2; // змінити значення на яке посилається вказівник
printf ("%d\n",i); // i = 2
system("pause");
}
Скомпілюйте наведений приклад.
Таким способом ми розглянули дві основні операції, які можна проводити з вказівниками: розіменування та присвоєння.
5. Void-вказівник
Поняття типу вказівника не існує, а існує лише поняття типу даних, на які посилається вказівник. Такі вказівники називають типованими. Якщо вказівник посилається на будь-який тип, то говорять про безтиповий або void-вказівник (void *i).
Void-вказівники забезпечують доступ до даних будь-якого типу. Для void-вказівників не підтримуються арифметичні операції, оскільки розмір не вказаний.
Для того щоб використовувати даний вказівник необхідно привести його до вказівника на тип даних відмінний від void.
Типований вказівник може бути присвоений безтиповому,
Приклад 3
#include <stdio.h>
#include <windows.h>
void main()
{
int *i;
void *z;
int j=5;
char c[]="aaaaa";
i=&j;
z=i;
z=&j;
z=&c;
system("pause");
}
Скомпілюйте наведений приклад.
але зворотнє присвоєння є хибним:
Приклад 4
#include <stdio.h>
#include <windows.h>
void main()
{
int *i;
void *z;
int j=5;
char c[]="aaaaa";
z=&j;
i=z;
z=&j;
z=&c;
system("pause");
}
Скомпілюйте наведений приклад.