Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SIT.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
349 Кб
Скачать
☆

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

После того как указатель был объявлен, но до того, как ему было присвоено какое-то значение, указатель содержит неизвестное значение. Попытка использовать указатель до присвоения ему какого-то значения является неприятной ошибкой, так как она может нарушить работу не только программы, но и операционной системы. Даже если этого не произошло, результат работы программы будет неправильным и найти эту ошибку будет очень сложно.

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

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

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

Программа 4.8:

#include<stdio.h>

void main()

{int i, *pi, **ppi;

i=7;

pi=&i;

ppi=&pi;

printf(“i=%d pi=%p ppi=%p\n”, i, pi,ppi); // i=7 pi=4E97:2210 ppi=4E97:220C

pi++;

printf(“i= %d pi - %p ppi = %p \n", i, pi, ppi); // i=7 pi-4E97:2212 ppi=4E97:220C

}

Если была попытка присвоить какое-либо значение тому, на что указывает указатель с нулевым значением, система выдает предупреждение, появляющееся во время работы программы (или после окончания работы программы) "Null pointer assignement". Появление этого сообщения является поводом для поиска использования неинициализированного указателя в пpoграмме.

Ссылки

Операция & означает ссылку, если она используется в следующем контексте Тип &<имяПеременной> = <инициализующее выражение>;

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

Чем же отличается ссылка от указателя? Рассмотрим следующий пример:

Программа 4.9:

#include<stdio.h>

void main() {

int y=16;

int &x=y;

printf(“x= %d\n", x);

y=12;

printf(“x= %d\n",x);

printf(“x=%p\n”,&x);

printf("address y= %p \n", &y);

}

Результат работы

X=16

X=12

&X=4EF5:2204

Address у=4EF5:2204

Ссылочная переменная х определяет местоположение переменной у в памяти в инициализирующем выражении int &x=y. Переменная х обрабатывается как нормальная переменная типа int. При обращении к такой переменной нет необходимости в операции снятия ссылки. Когда переменной у присваивается значение 12, то переменная х принимает новое значение, поскольку она определяет местоположение переменной у в памяти.

Функциональный эквивалент приведенного выше примера выглядит следующим образом:

Программа 4.10:

#include<stdio.h>

void main() {

int у=16;

int *x=&y;

printf("x=%d \n", *x);

у=12;

printf("х= %d \n", *x);

printf("x=%p \n", х);

printf("address y=%p \n", &y);

}

Результат paбoты этого кода будет аналогичен предыдущему.

Ссылочная переменная должна быть при объявлении инициализирована. Объявление int &х; не допустимо, поскольку неизвестно на что указывает переменная х.

Рассмотрим следующий пример инициализации ссылочных переменных:

Программа 4.11:

#include<stdio.h>

void main() {

float data[5]={0.0,1.0,2.0,3.0,4.0);

float &ref=dala[3];

printf(“ref=%0.3f\n", ref);

for(int i=0; i<5;i++){

data[i]=(float)-i;

printf(“data[ %d]= %0.2f\n", i, data[i]);

}

printf("ref %0.3f\n", ref);

ref=10;

printf("ref=%0.3f\n", ref);

printf("dala[3]= %0.2f\n", data[3]);

}

Результат работы программы

ref=3.000

data[0]=0.00

dala[1]=-1.00

data[2]=-2.00

data[3]=-3.00

dala [4]=-4.00

ref=-3.000

ref=10.000

data[3]=10.00

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]