Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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; Нарушение авторских прав |