Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ первый курс Alex Жив / C++ Перший курс / old / Lections 1 trim / Лекція №6 Вказівники.doc
Скачиваний:
29
Добавлен:
23.03.2015
Размер:
93.7 Кб
Скачать

Застосування до вказівників оператора sizeof

Як і до будь-якої змінної або типу даних, до вказівників можна застосовувати операцію визначення розміру sizeof. Вище відзначалося, що розмір вказівника може приймати одне із двох значень: два або чотири байти, що дозволяє вказівнику адресувати 2(28) = 65 Кбайт або 2(48) = 4 Гбайта пам'яті відповідно. На розмір вказівника (2 або 4 байта) впливає обрана модель пам'яті й ряд інших причин.

long X = 546213L ;

long* px = &X ;

cout << sizeof ( px ) << ‘\n’ ; // виводить на екран розмір вказівника 2 або 4 байта

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

Вказівники можуть самі посилатися на інші вказівники. При цьому в пам'яті, на яку посилається вказівник, утримується не значення, а адреса якого-небудь об'єкта. Сам об'єкт може також бути вказівником і т.д.

Синтаксис вказівника на вказівник виглядає в такий спосіб:

тип** ідентифікатор ;

При оголошенні вказівник на вказівник може ініціалізуватися адресою об'єкта. Число символів 'зірочка' ( * ) при оголошенні говорить про "порядок" вказівника. Щоб одержати доступ до значення, такий вказівник повинен бути розіменован відповідну кількість раз ( по числу символів ' * ').

char S = ‘H’ ; // оголошення змінної типу char

char* ps = &S ; // оголошення вказівника типу char і його ініціалізація

char** pps = &ps ; // оголошення вказівника на вказівник і його ініціалізація

char*** ppps = &pps ; // оголошення вказівника третього порядку і його ініціалізація

***ppps = 'L' ; // модифікує значення символу S

cout << ***ppps ; // виводить на екран значення символу S

Вказівники на функції

В C++ вказівники можуть посилатися на функції. Ім'я функції саме по собі представляє константний вказівник на цю функцію, тобто містить адресe входу в неї. Однак можна задати свій власний вказівник на дану функцію:

тип ( *ім'я_вказівника ) ( cпиcoк_типів_аргументів )

Наприклад,

bool ( *Funcptr ) ( char, long ) ;

оголошує вказівник Funcptr, що посилається на функцію, яка повертає логічне значення, та приймає в якості параметрів одну символьну й одну цілую довгу змінну.

Виклик функції через вказівник здійснюється так, начебто ім'я вказівника є просто іменем викликуваної функції. Тобто після імені вказівника вказується список аргументів, очікуваних функцією. Так, для наведеного вище вказівника на функцію Funcptr виклик може виглядати, наприклад, у такий спосіб:

bool flag ;

char Symbol = 'x' ;

long Num = 202L ;

flag = Funcptr ( Symbol, Num ) ;

Розглянемо приклад використання вказівника на функцію. Нехай задане яке-небудь ціле число, що характеризує місяць у році. Потрібно визначити, до якого сезону року ставиться даний місяць.

#include <iostream.h>

bool Isspring ( int ) ;

bool Issummer ( int ) ;

bool Isautumn ( int ) ;

bool Iswinter ( int ) ;

void main ()

{

int Month = 4 ;

bool ( *pfunc ) ( int ) = Iswinter ; if ( pfunc ( Month ) ) cout << "Зима" ;

ppunc = Isautumn ; if ( pfunc ( Month ) ) cout << "Осінь" ;

pfunc = Issummer ; if ( pfunc ( Month ) ) cout << "Літо" ;

pfunc = Isspring; if ( pfunc ( Month ) ) cout << "Весна" ;

}

bool Isspring (int x) { return ( x > 2 && x < 6 ) ; }

bool Issummer (int x) { return ( x > 5 && x < 9 ) ; }

bool Isautumn (int x) { return ( x > 8 && x<12 ) ; }

bool Iswinter (int x) { return ( x>11 || x < 3 ) ; }

У наведеній програмі створюється вказівник pfunc на функцію, що приймає один цілий аргумент й повертає логічне значення. Далі через вказівник по черзі викликаються функції, що визначають, чи попадає прийнятий аргумент у заданий діапазон. Логічні значення, що вертаються функціями, визначають, виводити чи ні на екран повідомлення.

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