Шаг 210.
Язык программирования C#. Начала.
Указатели. Указатели на экземпляр структуры

    На этом шаге мы рассмотрим использование указателея для доступа к элементам структуры.

    Если структура не содержит членов ссылочного типа, то для экземпляра такой структуры можно создать указатель. При объявлении указателя на экземпляр структуры тип указателя описывают как имя структуры, после которого стоит звездочка *. Например, если имеется структура MyStruct (без членов ссылочного типа) и мы хотим объявить указатель pnt на экземпляр такой структуры, то объявление указателя может выглядеть следующим образом:

  MyStruct* pnt;

    Указателю на экземпляр структуры в качестве значения присваивается адрес экземпляра структуры. Адрес экземпляра можно получить, разместив перед именем экземпляра инструкцию &. Чтобы по указателю получить доступ к экземпляру структуры, можем перед указателем поставить звездочку *. Но поскольку в экземпляре структуры нас обычно интересуют поля и методы, удобнее воспользоваться оператором -> (стрелка). Он используется в формате указатель->поле или указатель->метод (аргументы). Небольшой пример, в котором использованы указатели на структуры, представлен ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr210_1
{
    // Описание структуры: 
    struct MyStruct{
        // Поле:
        public int code;
        // Метод:
        public void show(){
            // Отображение значения поля:
            Console.WriteLine("Пoлe code: " + code);
        }
    }

    // Класс с главным методом: 
    class Program
    {
        // Главный метод: 
        unsafe static void Main()
        {
            // Создаются экземпляры структуры:
            MyStruct A, B;
            // Объявляется указатель на экземпляр структуры:
            MyStruct* p;
            // Указателю присваивается значение: 
            p = &A;
            // Обращение к полю через указатель: 
            p->code = 123;
            // Вызов метода через указатель: 
            p->show();
            // Вызов метода через экземпляр структуры:
            A.show();
            Console.WriteLine("--------------");
            // Новое значение указателя: 
            p = &B;
            // Обращение к полю через указатель: 
            p->code = 321;
            // Вызов метода через указатель: 
            p->show();
            // Вызов метода через экземпляр структуры:
            B.show();
            Console.WriteLine("--------------");
            // Еще один способ обратиться к полю:
            (*p).code = 456;
            // Еще один способ вызвать метод:
            (*p).show();
            // Вызов метода через экземпляр структуры:
            B.show();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы следующий:


Рис.1. Результат выполнения программы

    В программе описана структура MyStruct, в которой есть открытое целочисленное поле code и открытый метод show(). Метод при вызове отображает в консольном окне значение поля code экземпляра структуры, из которого вызывается.

    В главном методе программы командой

  MyStruct A, B; 
создаются экземпляры A и B структуры MyStruct. Командой
  MyStruct* p;
объявляется указатель p на экземпляр структуры MyStruct. Значение указателю присваивается командой
  p = &A;          . 
После ее выполнения указатель p ссылается на экземпляр A. Поэтому инструкция p->code является ссылкой на поле code экземпляра A. Например, командой
  p->code = 123;
полю code экземпляра A присваивается значение 123. Командой
  p->show(); 
из экземпляра A вызывается метод show(). Для проверки этот же метод вызывается командой
  A.show();     . 
Результаты обоих вызовов совпадают, как и должно быть.

    После выполнения команды

  p = &B; 
указатель p ссылается на экземпляр B. Поэтому при выполнении команды
  p->code = 321; 
значение присваивается полю code экземпляра B. Соответственно, результат выполнения команды
  p->show(); 
такой же, как и команды
  B.show();         , 
поскольку в обоих случаях вызывается метод show() экземпляра B.

    Стоит также заметить, что доступ к экземпляру можно получить с помощью инструкции *p. Например, при выполнении инструкции

  (*p).code = 456; 
(круглые скобки нужны для изменения порядка применения операторов) присваивается значение полю code экземпляра B. Метод show() из этого экземпляра можно вызвать с помощью инструкции
  (*p).show();            .

    На следующем шаге мы рассмотрим инструкцию fixed.




Предыдущий шаг Содержание Следующий шаг