Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Указатели на структуры



Указатели могут указывать и на структурный тип данных:

struct Point{

int x,y;

} r, *p;

p=&r;

Для обращения к полю структуры через указатель придется писать не только звездочку, но и скобки (т.к. операция "точка" имеет приоритет выше, чем "звездочка"):

(*p).x=3; // r.x=3

(*p).y=4; // r.y=4

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

-> (стрелка);

Она означает разадресацию указателя на структуру, стоящего слева от знака ->, и переход к полю этой структуры, указанному справа от ->. Поэтому вышеприведенный пример присваивания значений полям структур можно записать и короче:

p->x=3;

p->y=4;

В сущности, подобная операция уже давно знакома читателю: все стандартные компоненты C++ Builder'а являются как раз указателями на структуры ( точнее, на объекты - структуры, объявленные вместе с обрабатывающими их функциями). Поэтому, например, выражение Edit1->Text означает переход от указателя Edit1 (имеющего тип TEdit *) к самому объекту (имеющему тип TEdit) и его полю Text.

Сказанное иллюстрируется следующим примером:

Edit1->Text="A";

Edit2->Text="B";

Edit1=Edit2; // Edit1 теперь указывает на 2-ой Edit!

Edit1->Text="C";

В результате первый Edit сохранит значение "A", а второй получит значение "C". Отметим, что после выполнения этого фрагмента программы и Edit1 и Edit2 указывают на второй Edit, и любые операции и с Edit1, и с Edit2 будут относиться к нему; к первому же Edit'у вообще не осталось доступа из программы вплоть до завершения ее работы.

Присваивание указателей на компоненты С++ Builder'а может быть полезно, например, если компонент C++ Builder'а сделать аргументом при вызове функции.

Ссылка

Ссылка - это не особый тип данных, а "автоматически разыменуемый" указатель, т.е. это объект, который указывает на положение другой переменной.

Ссылка - это "неявный" указатель, который отличается от обычного "явного" указателя тем, что для ссылки не нужно специально записывать операцию разадресации (она подразумевается автоматически). Над указателями возможны арифметические операции. Над самой ссылкой арифметические операции невозможны (потому что они будут истолкованы компилятором как операции над тем объектом, на который ссылается ссылка).

Ссылка декларируется следующим образом:

type &ID = инициализатор;

Инициализатор - это идентификатор объекта, на который в дальнейшем будет указывать ссылка. Пример:

int a = 8;

int &r = a;

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

a++;

r++;

Наиболее полезны ссылки оказываются в качестве параметров функций, т.к. значение (конкретный адрес) им тогда присваивается при вызове функции. Например, вышеприведенный пример с функцией zam тогда можно переписать так:

void zam(int &x, int &y)

{

int t = x;

x = y;

y = t;

}

Участок программы с обращением к данной функции:

void zam (int&, int&);

void main (void)

{

int a=2, b=3;

printf(" a = %d, b = %d\n", a, b);

zam (a, b);

printf(" a = %d, b = %d\n", a, b);

}

Использование ссылок вместо "явных" указателей никак не могло повлиять на работу функции, но упростило и синтаксис ее тела, и (что еще важнее) синтаксис ее вызова.





Дата публикования: 2014-11-04; Прочитано: 386 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...