Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


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




З вказівками можна виконувати наступні операції: розадресації, або непряме звернення до об'єкту (*), привласнення, складання з константою, віднімання, інкремент (++), декремент (--), порівняння, приведення типів. При роботі з вказівками часто використовується операція отримання адреси (&). Операція розадресації, або розмикання, призначена для доступу до величини, адреса якої зберігається у вказівці. Цю операцію можна використовувати як для отримання, так і для зміни значення величини (якщо вона не оголошена як константа):

 

char а; // змінна типу char

char *р = new char; /* виділення пам'яті під вказівку та під динамічну змінну типу char */

*р = 'A'; а = *р; // надання значення обом змінним

 

Як видно з прикладу, конструкцію *ім’я_вказівки можна використовувати в лівій частині оператора привласнення, оскільки вона визначає адресу області пам'яті. Для простоти цю конструкцію можна вважати за ім'я змінної, на яку посилається вказівка. З нею допустимі всі дії, визначені для величин відповідного типу (якщо вказівка проініціалізована). На одну і ту ж область пам'яті може посилатися декілька вказівок різного типу. Застосована до них операція розадресації дасть різні результати. Наприклад, програма

 

#include <iostream>

using namespace std;

 

void 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 | аа |

 

Значення вказівок pint та pchar однакові, але розадресація pchar дає в результаті один молодший байт за цією адресою, а pint – два молодші байти.

У приведеному вище прикладі при ініціалізації вказівок були використані операції приведення типів. Синтаксис операції явного приведення типу простий: перед ім'ям змінної в дужках вказується тип, до якого її потрібно привести. При цьому не гарантується збереження інформації, тому в загальному випадку явних перетворень типу слід уникати. При змішуванні у виразі вказівок різних типів явне перетворення типів потрібне для всіх вказівок, окрім void*. Вказівка може неявно перетворюватися в значення типу bool (наприклад, у виразі умовного оператора), при цьому ненульова вказівка перетвориться в true, а нульова в false.

Привласнення без явного приведення типів допускається в двох випадках:

– вказівкам типу void*;

– якщо тип вказівок справа та зліва від операції привласнення один і той же.

Таким чином, неявне перетворення виконується тільки до типу void*. Значення 0 неявно перетвориться до вказівки на будь-який тип. Привласнення вказівок на об'єкти вказівкам на функції (і навпаки) неприпустимо. Заборонено і привласнювати значення вказівкам-константам, втім, як і константам будь-якого типу (привласнювати значення вказівкам на константу і змінним, на які посилається вказівка-константа, допускається).

Арифметичні операції з вказівками (складання з константою, віднімання, інкремент та декремент) автоматично враховують розмір типу величин, що адресуються вказівками. Ці операції застосовані тільки до вказівок одного типу і мають сенс в основному при роботі із структурами даних, послідовно розміщеними в пам'яті, наприклад, з масивами. Інкремент переміщує вказівку до наступного елементу масиву, декремент – до попереднього. Фактично значення вказівки змінюється на величину sizeof (тип). Якщо вказівка на певний тип збільшується або зменшується на константу, її значення змінюється на величину цієї константи, помножену на розмір об'єкту даного типу, наприклад:

 

short *р1 = new short [5];

p1++; //значення р збільшується на 2

long *p2 = new long [5];

p2++; //значення q збільшується на 4

 

Різниця двох вказівок – це різниця їх значень, що ділиться на розмір типу в байтах (у застосуванні до масивів різниця вказівок, наприклад, на третій і шостий елементи дорівнює 3). Додавання двох вказівок не допускається. При записі виразів з вказівками слід звертати увагу на пріоритети операцій. Як приклад розглянемо послідовність дій, задану в операторі

 

*р++ = 10;

 

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

 

*р = 10; p++;

 

Вираз (*р)++ навпаки, інкрементує значення, на яке посилається вказівка.

 

 


Поделиться:

Дата добавления: 2014-12-30; просмотров: 97; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты