Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоритические сведения для Лабораторной работы 7 Программирование.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
142 Кб
Скачать
☆

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

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

Примеры:

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

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 до тех пор, пока явно не будет задан тип, на который он указывет!

Выражения с указателями

Можно присваивать один указатель другому, но эта операция имеет смысл только в том случае, если оба указателя адресуют один и тот же тип, например

{ int i=123 *pi1=&i, *pi2;

// присваиваем указателю pi2 значение указателя pi1

pi2=pi1;

//выведем значения указателей:

printf(“ %p %p”, pi1, pi2);

}

В результате мы получим одно и то же значение адреса.

Указатели могут встречаться в выражениях, например:

int x=5, y, *px=&x;

y = *px + 5; // y получит значение 10

Приоритет у унарной операции разадресации * выше, чем у бинарных арифметических операций, поэтому при вычислении выражения *px + 5 вначале будет извлечено содержимое по адресу, хранящемуся в р ( то есть получено значение 5), а затем будет выполнена бинарная операция сложения.