Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
42
Добавлен:
02.05.2014
Размер:
543.23 Кб
Скачать

Билет 8

1. Указатели. Использование указателей при работе с массивами

Всякий раз, когда в выражении появляется идентификатор типа массива, он преобразуется в указатель на первый элемент массива. Из-за преобразований массивы не являются lvalue. По определению операция индексирования [] интерпретируется таким образом, что E1[E2] идентично *((E1)+(E2)). В силу правил преобразования, применяемых к +, если E1 массив и E2 целое, то E1[E2] отностится к E2-ому члену E1. Поэтому, несмотря на такое проявление асимметрии, индексирование является коммута­тивной операцией.

Это правило сообразным образом применяется в случае мно­гомерного массива. Если E является n-мерным массивом ранга i* j*...*k, то возникающее в выражении E преобразуется в указа­тель на (n-1)-мерный массив ранга j*...*k. Если к этому ука­зателю, явно или неявно, как результат индексирования, приме­няется операция *, ее результатом является (n-1)-мерный массив, на который указывалось, который сам тут же преобразу­ется в указатель.

Рассмотрим, например,

int x[3][5];

Здесь x - массив целых размером 3*5. Когда x возникает в выражении, он преобразуется в указатель на (первый из трех) 5

- элементный массив из целых. В выражении x[i], которое экви­валентно *(x+i), x сначала преобразуется, как было сказано, в указатель, затем i преобразуется к типу x, что включает в се­бя умножение i на длину объекта, на который указывает указа­тель, а именно объект из 5 целых. Результаты складываются, и используется косвенная адресация для получения массива (из 5 целых), который в свою очередь преобразуется в указатель на первое из целых. Если есть еще один индекс, снова использует­ся тот же параметр; на этот раз результатом является целое.

Именно из всего этого проистекает то, что массивы в С++ хранятся строкообразно (быстрее всего изменяется последний индекс), и что в описании первый индекс помогает определить объем памяти, поглощаемый массивом, но не играет никакой дру­гой роли в вычислениях индекса.

2. Оператор Goto

С++ снабжен имеющим дурную репутацию оператором goto.

goto идентификатор;

идентификатор : оператор

В общем, в программировании высокого уровня он имеет очень мало применений, но он может быть очень полезен, когда С++ программа генерируется программой, а не пишется непос­редственно человеком. Например, операторы goto можно исполь­зовать в синтаксическом анализаторе, порождаемом генератором синтаксических анализаторов. Оператор goto может быть также важен в тех редких случаях, когда важна наилучшая эффектив­ность, например, во внутреннем цикле какой-нибудь программы, работающей в реальном времени.

Одно из немногих разумных применений состоит в выходе из вложенного цикла или переключателя (break лишь прекращает вы­полнение самого внутреннего охватывающего его цикла или пе­реключателя). Например:

for (int i = 0; i<n; i++)

for (int j = 0; j<m; j++)

if (nm[i][j] == a) goto found // найдено

// не найдено

// ...

found: // найдено

// nm[i][j] == a

Имеется также оператор continue, который по сути делает переход на конец оператора цикла, как объясняется в #3.1.5.

Можно осуществлять безусловную передачу упраления с по­мощью оператора goto идентификатор ;

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

Соседние файлы в папке Програмки на C++