Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Операции с указателями. Инициализация указателей

Инициализация указателей

Преобразование указателей

Указатель void

Указатель типа void означает, что он ссылается на переменную неизвестного типа. Указатель на тип void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определён (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов).

Указателю на тип void можно присвоить значение указателя любого типа, а также сравнить его с любыми указателями, но перед выполнением каких-либо действий с областью памяти, на которую он ссылается, требуется преобразовать его к конкретному типу явным образом. Следовательно,

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

Для указателей поддерживаются неявные преобразования из любого типа указателя к типу void*. Любому указателю можно присвоить константу null. Кроме того, допускаются явные преобразования:

  • между указателями любого типа;
  • между указателями любого типа и целыми типами (со знаками и без знака).

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

Инициализация указателей может быть осуществлена различными способами.

1 способ. Присваивание указателю адреса существующего объекта:

  • С помощью операции получения адреса:

int a=5; //целая переменная

int*p=&a; //в указатель записывается адрес a

  • С помощью значения другого инициализированного указателя:

int*p1=p;// указатель p уже инициализирован

  • С помощью имени массива, которое трактуется как адрес:

int[]b= new int[]{10,20,30,40}; //массив

fixed (int*p2=b) {...}; //присваивание указателю р2 адреса начала массива

fixed (int*р2=&b[0]){...}; //то же самое

2 способ. Присваивание указателю адреса области памяти в явном виде:

сhar*p3=(char*)0x12F69E;

здесь 0x12F69E – шестнадцатеричная константа, (Char*) – операция явного приведения типа: константа преобразуется к типу указателя на char.

3 способ. Присваивание нулевого значения:

int*p4=null;

4 способ. Выделение области памяти в стеке и присваивание её адреса указателю:

int*р5=stackalloc int[10];

Здесь операция stackalloc выполняет выделение памяти под 10 величин типа int (массив из 10 элементов) и записывает адрес начала этой области памяти в переменную p5, которая может трактоваться как имя массива, так и указателем.

Основные операции с указателями приведены в таблице 10.1.

Таблица 10.1- Основные операции с указателями

Операция Описание
* Разадресация– получение значения, которое находится по адресу, хранящемуся в указателе.
-> Доступ к элементу структуры через указатель
[] Доступ к элементу массива через указатель
& Получение адреса переменной
++,-- Увеличение и уменьшение значения указателя на один адресуемый элемент
+,- Сложение с целой величиной и вычитание указателей
= =,!=,<>,<=,>= Сравнение адресов, хранящихся в указателях. Выполняется как сравнение беззнаковых целых величин.
stackalloc Выделение памяти в стеке под переменную, на которую ссылается указатель

Основными операциями с указателями являются * и &.

Обе эти операции являются унарными, т. е. имеют один операнд, перед которыми они ставятся. Операция & соответствует операции " взять адрес ". Операция * соответствует словам " значение, расположенное по указанному адресу ".

Операция * называется разадресацией или разыменованием. Она предназначена для доступа к величине, адрес которой хранится в указателе. Эту операцию можно использовать как для получения, так и для изменения значения величины.

Пример:

int a=5; //целая переменная

int*p=&a; //инициализация указателя адресом переменной а

Console.WriteLine (*p); //операция разадресации, результат равен 5

Console.WriteLine (++(*p)); //результат 6

int[]b=new int[] {10,20,30,40}; //массив

fixed (int*t=b) //инициализация указателя адресом начала массива

{

int*z=t; //инициализация указателя значением другого указателя

for (int i=0;i<b.length;++i)

{

t[i]+=5; //доступ к элементу массива (увеличение на 5)

*z+=5; //доступ с помощью адресации (увеличение ещё на 5)

++z; //инкремент указателя

}

}

В приведённом примере доступ к элементам массива выполняется двумя способами: путём индексации указателя t и путём разадресации указателя z, значение которого инкрементируется при каждом проходе цикла для перехода к следующему элементу массива.

Конструкцию *переменная можно использовать в левой части оператора присваивания, так как она определяет адрес области памяти. Для простоты эту конструкцию можно считать именем переменной, на которую ссылается указатель. С ней допустимы всей действия, определённые для величин соответствующего типа.

Оператор fixed фиксирует объект, адрес которого заносится в указатель, для того чтобы его не перемещал сборщик мусора и, таким образом, указатель остался корректным. Фиксация происходит на время выполнения блока, который записан после круглых скобок.

<== предыдущая лекция | следующая лекция ==>
Центрально стиснуті залізобетонні елементи з випадковими ексцентриситетами | Арифметические операции с указателями
Поделиться с друзьями:


Дата добавления: 2014-01-20; Просмотров: 652; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.