Разновидности указателей в С ++. Замечания о работе менеджера кучи в С++. Ссылки, структуры и объединения, страница 2

·  добавить в конец списка специальный параметр-индикатор с уникальным значением

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

//Функция выполняет суммировние значений своих параметров

# include < costream.h >

long summa (int k, …);    //k - количество параметров

{

 int* pik = & k;

 long total = 0;

 for (;k;k--) total + = * (++pik); return total;

}

void main ()

{

 cout << summa (2,6,4); cout<<summa(4,10,20,30,40);

}

Модификаторы функций

extern – по умолчанию, функции доступны вне модулей, внутри которых они определены

static – функция доступна только внутри того модуля, в котором она определена

cdecl – по умолчанию стандартная для С++ последовательность размещения параметров в стеке, согласно которой первым обрабатывается и помещается в стек последний из параметров функции. При этом у него оказывается максимальный адрес. Именно поэтому для перехода от одного параметра к другому указатель заданного типа увеличивается на единицу. Считается, сто именно вызывющий оператор отвечает за удаление из стека любых значений аргументов, переданных функции.

pascal – противоположный принятому в С++ порядок размещения и обработки параметров в стеке, свойственный языку Pascal. Когда оператор вызывает функцию, значения аргументов проталкиваются в стек. Функция сама отвечает за удаление из стека лююых значений аргументов. Применение модификатора pascal необходимо, когда функция, написанная на С или С++, будет вызываться из программы на Pascal.

_fastcall – аргументы функции передаются через регистры (быстрый вызов)

interrupt – функция объявляется как программа обработки прерываний

near – объявляет функцию, которую можно вызвать только внутри того же самого сегмента (для моделей памяти tiny, small,compact)

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

Подставляемые функции

Определяются со спецификатором inline

inline float module (float X = 0 , float y = 0)

//возвращает расстояние от начала координат до точки (х,у)

{return sgrt (x*x+y*y);} 

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

Функции и массивы

              Массивы могут быть параметрами, возвращаемыми функциями, как правило, через указатель, и могут быть входными параметрами функции. При этом возникает проблема определения количества элементов в массиве, так как в C++ нельзя определить размерность массива по его имени или указателю на массив.

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

int sum (int n, int A [])

{int S=0; for (int i=0; i<n; i++) S+=A[i]; return S}

void main ()

{

 int MA []={1,2,3,4,5};

 cout << sum (sizeof (MA) / sizeof (MA[0]), MA);

}

Указатели на функции

тип_возвращ_значения (*имя_указателя) (сигнатура);

int (* funcptr) (char);