Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++book1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.83 Mб
Скачать

8.4.1 Примеры

Описание

int i; int *pi; int f (); int *fpi (); int (*pif) ();

описывает целое i, указатель pi на целое, функцию f, возвращающую целое, функцию fpi , возвращающую указатель на целое, и указатель pif на функцию, возвращающую целое. Осо­бенно полезно сравнить последние две. Цепочка *fpi() есть *(fpi()), как предполагается в описании, и та же конструкция требуется в выражении, вызов функции fpi, и затем использова­ние косвенного обращения через (указательный) результ, чтобы получить целое. В описателе (*pif)() дополнительные скобки необходимы для указания того, что косвенность через указатель на функцию дает функцию, которая затем вызывается. Функции f и fpi описаны как не получающие параметров, а pif как указы­вающая на функцию, не получающую параметров.

Описание

const a = 10, *pc = &a, *const cpc = pc;

int b, *const cp = &b;

описывает a: целую константу, pc: указатель на целую константу, cpc: константный указатель на целую константу, b: целое и cp: константный указатель на целое. Значения a, cpc и cp не могут быть изменены после инициализации. Значение pc может быть изменено, как и объект, указываемый cp. Примеры недопустимых выражений:

a = 1;

a++;

*pc = 2;

cp = &a;

cpc++;

Примеры допустимых выражений:

b = a;

*cp = a;

pc++;

pc = cpc;

Описание

fseek (FILE*,long,int);

описывает функцию, получающую три параметра указанных типов. Поскольку тип возвращаемого значения не задан, он при­нимается int (#8.2). Описание

point (int = 0,int = 0);

описывает функцию, которая может вызываться без парамет­ров, с одним или с двумя параметрами типа int. Ее можно вызы­вать одним из следующих способов:

point (1,2);

point (1); point ();

Описание

printf (char* ... );

описывает функцию, которая может вызываться с различными числом и типами параметров. Например

printf ("hello, world");

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

Однако, всегда ее первым параметром должен быть char*.

Описание

float fa[17], *afp[17];

описывает массив чисел с плавающей точкой и массив ука­зателей на числа с плавающей точкой. И, наконец,

static int x3d[3][5][7];

описывает массив целых, размером 3x6x7. Совсем подробно: x3d является массивом из трех элементов данных; каждый из элементов данных является массивом из пяти массивов; каждый из последних массивов является массивом из семи целых. Появ­ление каждое из выражений x3d, x3d[i], x3d[i][j], x3d[i][j][k] может быть приемлемо в выражении.

8.4.2 Массивы, Указатели и Индексирование

Всякий раз, когда в выражении появляется идентификатор типа массива, он преобразуется в указатель на первый элемент массива. Из-за преобразований массивы не являются 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 целых), который в свою очередь преобразуется в указатель на первое из целых. Если есть еще один индекс, снова использует­ся тот же параметр; на этот раз результатом является целое.

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

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