АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Итерпритация сложных описаний изнутри наружу

Читайте также:
  1. Аудирование сложных описательных текстов, включающих в себя развернутые метафоры.
  2. В сложных ситуациях
  3. Вырубка. Высечка сложных форм
  4. Кибернетика - наука о сложных системах
  5. Нахождение научных описаний рукописей
  6. Подробное описание сложных участков с указанием временных интервалов (Автор: Кузнецова Ира)
  7. Примеры оформления библиографических описаний документов
  8. Составление научных описаний рукописей
  9. Типы сложных предложений

Операции *, [], (), & могут разными способами комбинироваться с идентификаторами. Например:
int *V[10]- массив
int (*p)[10]- указатель на массив с 10 элементов

При комбинации модификаторов в описании недопустимы варианты:

1) элементами массива не могут быть функции

2) функции не могут возвращать массив. Указатель на функцию может

3) при интерпретации сложных описаний [] и () скобки (они всегда справа от интерпретатора) имеют више приоритет перед * и & (всегда слева от имени)

[] и () скобки имеют одинаковый приоритет т связываются слева на право. Спецификатор типа рассматривается на последнем шаге.

Можно использовать () для изменения приоритета операций.

Интерпретация сложных описаний изнутри снаружи:

1) Начать с идентификатора и посмотреть направо есть ли [] или () скобки.

2) Если они есть разобрать эту часть, описать и затем посмотреть налево в поисках * или &.

3) Если на любом этапе разбора справа встретится закрытая круглая скобка, то применить это правило внутри круглых скобок, а затем продолжить интерпретацию.

4) Интерпретировать спецификацию типа.

int * (* comp [10]) ();
6 5 3 1 2 4


42. Ссылки в С++

Ссылки являются другим именем объекта (=синоним, алеас).

Главное применение ссылок состоит в определении параметров и возврате значений для функции вообще и для перегруженных операторов в частности.

Инициализация:

int i=1;

int & r= i; //r и i ссылаются на один и тот же int

int x=r; // = i =>1

r=2; //=>i=2, мы меняем не r, а то что в этой памяти

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

int ii = 0;

int & rr = ii;

rr++; // =ii++

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

Int k[10];

int *p = & i;

p++; //→ на 1 int от i

p=k; //= & k[0]

// p+N это p + N * sizeof (type)

Ссылка – постоянный после инициализации ук-ль.

Ссылка используется для реализации функции, которая меняет значение своего параметра (так же как и с ук-лем):

Пример1 (ссылка)

void incr (int & aa)

{ aa++; }

Пример2 (указатель)

void next (int * bb)

{ (* bb)++; }

Пример3

int plus (int cc)

{return cc+1;}

Пример4

void plus_bad (int dd)

{dd++;}

 

void f ()

{ int x = 1;

incr (x); //пр1, x=2

cout << ”x=” << x;

next (&x); //пр2, x=2+1=3

int y=plus1 (x); //пр3

cout<<”x+1=”<< plus1 (x);

plus_bad (х); //пр4, но х не изменится, т к мы

//работали с копией в рабочей памяти (стеке)

}

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

double & ref (int index); //-прототип

можно записывать ref (index)=…;

Тонкости при использовании параметров ссылок.

void change_value (int & p)

{ p+=20;

cout <<”значение р в change_value=”<<p<<endl;}

void main (void)

{ int x=50;

change_value (x);

cout<< “x=”<<x; // p=70; x=70;

int y=100;

change_value (x+y); //p=190 (находится в стеке),

//не все компиляторы пропустят

cout <<’x=”<<x<<” y = “<<y; //у=100; x=70; т.к. нет

//переменной х+у выделилась рабочая память

//под вычесленный х+у в стеке и удалилась после

//выполнения ф-ции

float r=-1,5;

change_value (r); //p=19, в р отброс. дробн. часть

cout<<”r=”<<r; //r=-1,5, т к преобраз происходило

// в доп памяти

При выполнении ф-ции создается:

int temp =r; //temp=-1

temp+=20; //а когда ф-ции закончится, temp

//уничтожится

Аргументы, передающиеся по значению, невозможно в вызове (внешне) отличить от аргументов, передающиеся по ссылке. Это компилятор видит из прототипа или заголовка функции.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 |

Поиск по сайту:



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