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


Полезное:

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


Категории:

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






Операции с указателями





Кроме операции разыменовывания к указателям применимы еще и некоторые арифметические операции (+, ++, -, --, +=, -=) и преобразования. Например, мы можем преобразовать число в указатель:

int* x; // определение указателя int y = 10; // определяем переменную x = &y; // указатель x теперь указывает на адрес переменной y   // получим адрес переменной y uint addr = (uint)x; Console.WriteLine("Адрес переменной y: {0}", addr);   byte* bytePointer = (byte*)addr+4; // получить указатель на следующий байт после addr Console.WriteLine("Значение int по адресу {0}: {1}", addr+4, *bytePointer);   // обратная операция uint oldAddr = (uint)bytePointer - 4; // вычитаем четыре байта, так как bytePointer - указатель на байт int* intPointer = (int*)oldAddr; Console.WriteLine("Значение int по адресу {0}: {1}", oldAddr, *intPointer);   // преобразование в тип double double* doublePointer = (double*)addr + 4; Console.WriteLine("Значение double по адресу {0}: {1}", addr + 4, *doublePointer);

Так как у нас x - указатель на объект int, который занимает 4 байта, то мы можем получить следующий за ним байт с помощью выражения byte* chp = (byte*)addr+4;. Теперь указатель bytePointer указывает на следующий байт. Равным образом мы можем создать и другой указатель double* doublePointer = (double*)addr + 4;, только этот указатель уже будет указывать на следующие 8 байт, так как тип double занимает 8 байт.

Чтобы обратно получить исходный адрес, вызываем выражение bytePointer - 4. Здесь bytePointer - это указатель, а не число, и операции вычитания и сложения будут происходить в соответствии с правилами арифметики указателей. Например:

char* charPointer = (char*)123400; charPointer += 4; // 123408 Console.WriteLine("Адрес {0}", (uint)charPointer);

Хотя мы к указателю прибавляем число 4, но итоговый адрес увеличится на 8, так как размер объекта char - 2 байта, а 2*4=8. Подобным образом действует сложение с другими типа указателей:

double* doublePointer = (double*)123000; doublePointer = doublePointer+3; // 123024 Console.WriteLine("Адрес {0}", (uint)doublePointer);

Аналогично работает вычитание: doublePointer -=2 установит в указателе doublePointer в качестве адреса число 123008

Date: 2016-05-16; view: 240; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



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