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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



Указатель – это адрес памяти, распределяемой для размещения идентификатора (в качестве идентификатора может выступать имя переменной, массива, структуры, строкового литерала). В том случае, если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находиться скалярная величина любого типа. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя:                спецификатор-типа [ модификатор ] * описатель; Инициализация указателей (указатель null) После того как указатель был объявлен, но до того, как ему было присвоено какое-то значение, указатель содержит неизвестное значение. Попытка использовать указатель до присвоения ему какого-то значения является ошибкой, она может нарушить работу не только программы, но и операционной системы. Даже если этого не произошло, результат работы программы будет неправильным и найти эту ошибку будет достаточно сложно.Принято считать, что указатель, который указывает в "никуда", должен иметь значение null, однако и это не делает его "безопасным". После того как он попадет в правую или левую часть оператора присваивания, он вновь может стать "опасным".С другой стороны нулевой указатель можно использовать, например, для обозначения конца массива указателей.Если была попытка присвоить какое-либо значение тому, на что указывает указатель с нулевым значением, система выдает предупреждение, появляющееся во время работы программы (или после окончания работы программы) "Null pointer assignement". Появление этого сообщения указывает программисту осуществить поиск использования неинициализированного указателя в программе.

 

22. Указательные переменные. Операции получения адреса (&) и раскрытия ссылки(*).

Указательные переменные Указатель – это переменная, которая содержит адрес некоторого объекта.Указатели чаще всего используются при работе с динамической памятью. Доступ к выделенным участкам динамической памяти, называемых динамическими переменными, производится только через указатель. Время жизни динамических переменных – от точки создания до конца программы или до явного освобождения памяти.В С различают 3 вида указателей:– указатели на объект;– указатели на функцию;– указатели на void, отличающиеся свойствами и набором допустимых операций.Указатель на функцию содержит адрес в сегменте кода, адрес, по которому передается управление при вызове функции. Они используются для косвенного вызова функции (не через ее имя, а через обращение переменной, хранящей ее адрес), а также для передачи имени функции в другую функцию в качестве параметра.               тип(*имя)(список типов аргументов);               Пример:               int (*fun)(double, double);                задает указатель с именем fun на функцию, возвращающую значение типа int и имеющую 2 аргумента типа double.Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа.тип *имя;В этом объявлении тип – некоторый тип языка С, определяющий тип объекта, на который указывает указатель (адрес которого содержит). * – следующая за ней переменная является указателем. Она относится непосредственно к имени, поэтому для того, чтобы объявить несколько указателей, требуется вставить ее перед именем каждого из них.Пример:               int *a, b, *c;Описываются 2 указателя на целое с именами а и с, а также целая переменная b.Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, неопределен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов). Однако для того, чтобы можно было выполнить арифметические и логические операции над указателями или над объектами, на которые они указывают, необходимо при выполнении каждой операции явно определить тип объекта. Такие определения типов могут быть выполнены с помощью операции приведения типов. Указателю на void можно присвоить указатель любого другого типа. Однако при обратном присваивании необходимо использовать явные преобразования указателя на void.Пример:               …               void *p1; // объявление указателя на тип void               float f, *p2; // объявление указателя на тип float (p2) и переменной того же типа (f)               p2 = &f; // указатель p2 теперь указывает на f (они имеют один и тот же адрес)               p1 = p2; // присваивание указателю void указателя типа float               p2 = (float *)p1; /* обратное присваивание: указателю p2 присваивается указатель p1,                                                                                                                       предварительно преобразовав p1 к типу float */ Операции получения адреса (&) и раскрытия ссылки (*) С указателями связаны 2 специальные операции: & и *. Обе эти операции являются унарными, т.е. имеют один операнд, перед которыи они ставятся.Операция & соответствует операции "взять адрес"; операция * соответствует словам "значение, расположенное по указанному адресу".В объявлении переменной, являющейся указателем, очень важен базовый тип. Компилятор знает, сколько байт памяти занимает переменная, на которую указывает данный указатель из базового типа указателей. Если указатель имеет базовый тип int, то переменная занимает 2 байта, char – 1 байт и т.д.Пример:               // работа с указателями               {               float x = 10.1, y; // объявление с инициализацией x и y               float *point; // объявление указателя point на тип float               point = &x; // применение операции взятия адреса; теперь указатель point указывает на x                y = *point; /* применение операции взятия значения, расположенному по адресу, на который                                                         указывает point; теперь y содержит значение x (т.к. point указывал на x */               printf ("x = %d", x, "y = %d", y); // вывод значения x и y (они одинаковы)               ++ *point; /* увеличение на единицу значения, расположенного по адресу, на который                                                         указывает указатель point */               printf ("\n x = %d", x, "y = %d", y); /* теперь значение x увеличено на единицу, а y –                                                                                                                                                                                                                       без изменения */               y = 1+ *point*y; // сумма единицы и значения указателя point * на значение переменной y                printf("\n x = %d", x, "y = %d", y); // вывод значений x и y               getch();               }

 



Поделиться:


Последнее изменение этой страницы: 2021-08-16; просмотров: 58; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.182.45 (0.004 с.)