Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

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






Лекция 12. Указательна языке С++ - это объект, значением которого является адрес





Указатели

Указательна языке С++ - это объект, значением которого является адрес. Во внутреннем представлении адрес может занимать 2 или 4 байта в зависимости от реализации языка.

Определение указателя имеет следующий синтаксис:

<type>*<имя указателя>;

Здесь <type> - это тип объекта, на который ссылается указатель; <имя указателя> -это идентификатор, * - операция обращения по адресу.

Например:

 

int *ptrint; // адрес целого числа, занимающего в памяти 2 байта

float *ptrfl; // адрес вещественного числа, занимающего в памяти 4 байта

char *ptrch; // адрес символа, занимающего в памяти 1 байт

 

Если необходимо перечислить в определении несколько указателей, ссылающихся на объекты одного типа, то ‘*’ записывают перед каждым указателем.

Например:

char *p1, *p2, *p3;

 

При определении указателя можно выполнять его инициализацию:

 

<type>*<имя указателя>=<инициализирующее выражение>;

или

<type>*<имя указателя>(<инициализирующее выражение>);

В качестве инициализирующего выражения можно использовать:

- явно указанный адрес;

- указатель, имеющий значение;

- выражение, значением которого является адрес.

Если значение инициализирующего выражения равно 0, то оно преобразуется к пустому указателю NULL.

Примеры.

char *ptrchr =(char *)0xF000FFFF; // явно указанный адрес

int *ptrint(NULL);

 

Выражение, позволяющее получить адрес объекта, имеет следующий вид:

&<операнд>

Здесь унарный оператор ‘&’ возвращает адрес операнда. Этот оператор применим к объектам, имеющим имя и размещенным в памяти компьютера.

Например:

float e = 15.4462;

float *pe = &e; // указателю ре присваивается адрес переменной епри его

// определении

После определения указателя ре к переменной е можно обращаться по её имени и с помощью адреса, являющегося значением указателя ре.

Например:

cout << “\n e = “ << e;

cout << “\n *pe = “ << *pe; //значение, записанное по адресу ре

Результат:

е = 15.4462 00

*ре = 15.4462 00

 

Если указатель получил нулевое значение, то обращаться по адресу нельзя.

Итак, выражение для обращения по адресу имеет следующий вид:

*<имя указателя>

Это выражение можно использовать везде, где допустимо применение имен объектов того типа, к которому относится указатель.

Пример:

void main()

{

int t = 3200;

int *ptr = &t;

int value = *ptr; // присваивание значения с помощью указателя

cout << “value=” << value << ‘\n’;

}

Результат:

value = 3200

В языке С++ можно определять указатели, не связывая их с конкретным типом данных:

void *vp;

Такой указатель можно связывать с различными типами данных.

Пример.

#include <iostream.h>

void main()

{ void *vp;

int i = 77;

float e = 2.718282;

vp = &i; // настроились на целый тип int

cout << “\n *(int *)vp = ” << *(int *)vp;

vp = &e; // настроились на вещественный тип float

cout << “\n *(float *)vp = ” << *(float *)vp;

}

 

Результат:

 

*(int *)vp = 77

*(float *)vp =2.718282

 

В языке С++ разрешено присваивание указателю типа void *значения любого указателя, но не наоборот.

Пример.

 

void *vp;

int *ip;

….

ip = vp; // нельзя

….

vp = ip; // можно

….

Над указателями определены следующие арифметические операции:

- сложение указателя и константы;

- вычитание из указателя константы;

- вычитание указателей;

- инкремент;

- декремент.

Рассмотрим эти операции.

В языке С++ можно применять операцию вычитания к указателям одного типа и к указателю и целой const.

Разность двух указателей определяется в единицах, кратных длине (в байтах) объекта того типа, к которому отнесен указатель.

Разность указателей, адресующих два смежных объекта любого типа по абсолютной величине равна 1.

Пример.

#include <iostream.h>

void main()

{ int a = 1, b = 2;

int *pa = &a, *pb = &b;

cout << “\n pa = “ << pa; // адрес а

cout << “\n pb = “ << pb; // адрес b

cout << “\n (pa-pb) = “ << (pa-pb);

cout << “\n“ << (int)pa – (int)pb;

}

Результат:

pa = 0xfff4

pb = 0xfff2

(pa – pb) = 1

|| Существует различие между разностью однотипных указателей и разностью числовых значений этих указателей

|| Переменная, определенная в тексте программы позднее, имеет меньший адрес. Компилятор размещает объекты в обратном порядке, т.к. использует стек.


Из указателя можно вычитать целое число. При этом числовое значение указателя уменьшится на величину

k * sizeof(type)

где k – вычитаемое, type - тип объекта, к которому отнесён указатель.

Аналогично выполняется операция сложения указателя с целым числом.

|| В языке С++ запрещено суммирование двух указателей.

 

#include <iostream.h>

void main()

{ float zero = 0.0, pi = 3.1415, e = 2.7182;

float *ptr = &e;

cout << “\n ptr = “ << ptr << “*ptr = “ << *ptr;

cout << “\n (ptr+1) = “ << (ptr+1) << “*(ptr+1)=” << *(ptr+1);

cout << “\n (ptr+2) = “ << (ptr+2) << “*(ptr+2)=” << *(ptr+2);

}

 

 

Результат:

ptr = 0xffea *ptr = 2.7182

(ptr + 1) = 0xffee *(ptr+1) = 3.1415

(ptr+2) = 0xfff2 *(ptr+2)=0

 

Сравнение указателей

Указатели можно сравнивать, используя операции отношения ‘= =’ и ‘<’ и ‘>’.

Если указатели ссылаются на переменные, между которыми существует связь (например, между элементами одного массива), то результат сравнения имеет смысл. Кроме того, любой указатель можно сравнивать с нулевым указателем.

 

Замечание.

Работать с указателями нужно аккуратно, поскольку объекты, чьи определения размещены последовательно, не всегда размещаются в памяти друг за другом. Язык С++ это не гарантирует.

 

Вопросы

1. Указатель – это объект, значением которого является _______________.

.

2. Выражение, позволяющее получить адрес объекта X:

1. $X

2. *X

3. &X

4. X*

5. #X

3. Укажите, какие арифметически операции определены над указателями

1. сложение указателей;

2. вычитание указателей;

3. сложение указателя и константы;

4. вычитание из указателя константы;

5. умножение указателей.

 







Date: 2015-12-12; view: 422; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.011 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию