Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
відповіді ооп( більше половини).docx
Скачиваний:
8
Добавлен:
21.09.2019
Размер:
165.75 Кб
Скачать

35. Ініціалізація вказівників. Операції над ними.

1. Присвоєння вказівнику адреси існуючого об’єкта

а) за допомогою взяття адреси

int a=5;

int *p=&a;

або int *p(&a);

б) за допомогою іншого ініціалізованого вказівника. У випадку вказівника на вказівник, перший вказівник містить адресу другого вказівника, який в свою чергу містить адресу комірки пам’яті, в якій міститься деяке значення int **pp=&p;

в) за допомогою імені масиву або функцій, які трактуються як вказівники

int b[10];

int *t=b;

void f(int a) {…};

void (*pf) (int);

pf=f;

2. Присвоєння вказівнику адреси ділянки пам’яті явним чином:

char *vp=(char*)0xB8000000;

3. Присвоєння вказівнику порожнього значення

int *s = NULL;

int*r = 0; як ціла константа

4. Виділення ділянки динамічної памяті і присвоєння її адреси вказівнику

С++ : int *n=new int;

int *m=new int(10); // ініціалізатор для динамічної змінної, на яку вказує m

або *m=10;

int *q=new int [10]; // масив

....

delete n; delete m;

delete q[];

C : int *n = (int *) malloc;

(sizeof (int));

free(n);

Приклад: int *(*p[10]) (); // масив і 10 вказівників на функції типу int *

Операції з вказівниками.

Над вказівниками визначені арифметичні операції та операції порівняння (табл.).

Операція

Приклад і пояснення

==, !=,

>=, <=, >, <

Порівняння значення двох вказівників (адреси, на які вони вказують). Наприклад, якщо вказівники вказують на одне і те ж саме дане, то результатом vk1 == vk2 буде істина, інакше – фальш

vk1 – vk2. Використовується для визначення кількості елементів, які наявні між двома вказівниками

+, –

vk1 + k, vk1 – k. Знаходить вказівник, який зміщений відносно даного на k одиниць.

++ / --

Інкремент / Декремент

Докладніше див. Лабораторна робота 4 (розділ – робота з вказівниками)

Операція розадресації (розіменування) – призначена для доступу до значення, адреса якого зберігається у вказівнику.

char a;

char *p=new char;

*p=’s’;

a=*p;

На одну і ту саму ділянку пам’яті можуть вказувати різні вказівники різного типу і операція розадресації дасть різні результати.

# include <stdio.h>

main ()

{

unsigned long int A=0xcc77ffaa;

unsigned short int *pint = (unsigned short int*) &A;

unsigned char *pchar = (unsigned char *)&A;

printf ("| %x | %x | %x |", A, *pint, *pchar);

}

На екрані: |cc77ffaa|ffaa|aa|

Молодші розряди йдуть в молодші адреси (байти)

Типові помилки програмування при роботі з вказівниками.

  1. Використання арифметичних дій з вказівниками, що посилаються не на елементи масиву.

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

  3. Вихід за межі масиву при використанні арифметичних дій з вказівниками.

  4. Присвоювання вказівника одного типу вказівнику іншого типу (відмінного від void*) викликає синтаксичну помилку.

  5. Розіменування вказівника на void*.