Мегаобучалка Главная | О нас | Обратная связь


Указатель на неопределенный тип



2016-09-16 643 Обсуждений (0)
Указатель на неопределенный тип 0.00 из 5.00 0 оценок




Указатель – это переменная, хранящая адрес некоторого данного (объекта).

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

 

Таким образом, указатель является просто адресом байта памяти компьютера.

Использование указателей в программах на С позволяет:

 

1. Упростить работу с массивами;

2. Распределять память под данные динамически, то есть в процессе исполнения программы;

3. Выполнить запись и чтение данных в любом месте памяти.

 

Значение указателя сообщает о том, где размещен объект.

 

Объявление указателей

Указатели, как и другие переменные, должны быть объявлены в программе. При объявлении указателя перед его именем ставится *. В общем случае объявление переменной – указателя имеет вид:

 

класс памяти тип * имя ;

·

· означает “указатель на “.

 

Например,

int * iptr;

 

iptr - это указатель на объект типа int. Этим объектом может быть простая переменная, типа int, массив элементов типа int или блок памяти, полученный, например, при динамическом распределении памяти.

 

Другие примеры объявления указателей:

 

static float *f;

 

extern double *z;

 

extern char *ch;

 

Каждое из этих объявлений выделяет память для переменной типа указатель, но каждый из указателей пока ни на что не указывает

 

До тех пор, пока указателю не будет присвоен адрес какого – либо объекта, его нельзя использовать в программе.

 

Для получения адреса какого – либо объекта используется операция &. Эта операция позволяет присваивать указателям адреса объектов. Например:

 

int a, *aptr;

char c, *cp;

aptr=&a;

cp=&c;

 

Доступ к объекту через указатель

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

Для вывода адреса памяти, содержащегося в указателе, необходимо использовать спецификацию формата %p Значение адреса выводится в шестнадцатеричной системе счисления.

 

Пример 1. Программа, выводящая значение указателя и значение объекта, на который он указывает.

 

#include <stdio.h>

 

void main (void)

{

int x, *px;

px=&x;

x=35;

 

printf("адрес x: %p\n",&x);

printf("Значение указателя: %p\n",px);

 

printf("Значение х: %d\n",x);

printf("Значение, адресуемое указателем: %d\n",*px);

}

 

Эта программа выводит следующее:

адрес x: FFF4

Значение указателя: FFF4

Значение х: 35

Значение, адресуемое указателем: 35

 

Связь между переменной х и указателем px схематично показана на рисунке1.

 

 
 

 


Переменная-указатель px Переменная х

 

Унарная операция разадресации * может быть использована в левой части оператора присваивания, чтобы какие-то данные были запомнены в области памяти, на которую указывает указатель. Например:

 

float y, *py =&y;

 

*py= -1.2;

 

Здесь *py= -1.2 означает присвоение значения –1.2 по адресу, хранящемуся в указателе, то есть, то же, что и

y = -1.2;

 

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

 

Следует избегать использования в программе неинициализированных указателей. Всегда должен существовать объект, адрес которого содержит указатель. При этом указатель всегда должен указывать на объект того же типа, с которым он объявлен.

Примеры:

 

Правильно Не правильно

       
 
float f, *fp = &f;   char s[80] , *sp=s;
 
float f ; int *pi; pi = &f; // ошибка!

 

 


Ошибка заключена в том, что указателю на данное целого типа присваивается адре переменной вещественного типа, а это не допустимо.

 

Указатель на неопределенный тип

 

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

 

void * имя;

 

Например, void *ptr;

Служебное слово void в объявлении указателя позволяет отсрочить определение типа объекта, на который он указывает.

Указатель на тип void может быть использован для ссылки на объект любого типа. Но для того, чтобы оперировать таким указателем в программе, необходимо явно задать тип в каждой операции с указателем. Для этого следует использовать операцию приведения типа указателя:

(тип *) указатель

 

Пример 2. Программа, в которой используется указатель на неопределенный тип

 

#include <stdio.h>

void main (void)

{

int a =123;

double d= 3.45678;

 

// объвление указателя на неопределенный тип

void *vp;

 

//указатель на неопределенный тип инициализирован адресом объекта целого типа

vp=&a;

//перед выводом значения объекта целого типа , адресуемого указателем vp,

// тип указателя явно приводится к целому

printf("a=%d \n", *((int *)vp));

//указатель на неопределенный тип инициализирован адресом объекта типа double

vp=&d;

//перед выводом значения объекта типа double , адресуемого указателем vp,

// тип указателя явно приводится к типу double

printf("d=%lf \n", *((double *)vp));

 

}

 

Эта программа выведет следующее:

 

a=123

d=3.456780

 

Следует отметить, что в программе, показанной в примере 2, ни одна операция не может быть выполнена над указателем vp до тех пор, пока явно не будет задан тип, на который он указывет!

 



2016-09-16 643 Обсуждений (0)
Указатель на неопределенный тип 0.00 из 5.00 0 оценок









Обсуждение в статье: Указатель на неопределенный тип

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (643)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)