Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_poryadku_proga.doc
Скачиваний:
4
Добавлен:
15.04.2019
Размер:
1.07 Mб
Скачать

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

Имя функции является адресом этой функции в памяти.

Язык программирования Си позволяет определять указатели на функции. Например, следующая инструкция int (*fp)(int x, int y);

Пример int add(int x, int y) { return x + y;} int sub(int x, int y) { return x - y;}

void main() { int (*p)(int, int); p = add; /* вызываем функцию через указатель */ printf("1 + 2 = %d\n", (*p)(1, 2));   p = sub; /* можно вызвать функцию и так */ printf("1 - 2 = %d\n", p(1, 2)); return 0;

}

12.9. Указатель на void Существует указатель на объект любого типа: void* имя; Действия с указателем: ·        переменной типа void* можно присвоить указатель на объект любого типа;

 · void* нельзя разыменовывать.

 · void* можно явно преобразовать в указатель на другой тип.

·  один void* можно присвоить другому void*; ·  пару void* можно сравнивать на равенство и неравенство; · нельзя изменять void* (размер объекта неизвестен)

Основными применениями void* являются: -передача указателей функциям, которым не позволено делать предположения о типе объектов -возврат объектов «неуточненного типа» из функций.

Чтобы воспользоваться таким объектом, необходимо явно преобразовать тип указателя.

12.9. Алгоритмы преобразование и перестановки .

void swaptmp(int *px, int *py) /* перестановка *px и *py */ { // Обмен чисел int temp; temp = *px; *px = *py; *py = temp; }

void swap(int *px, int *py) /* перестановка *px и *py */ { // Обмен чисел *px ^= *py; *py ^= *px; *px ^= *py; }

int* Revers(int *a, int n) // Переворачивание элементов массива { int k; for (int i=0;i<n/2;i++) { k=a[i]; a[i]=a[n-i-1]; a[n-i-1]=k; } return a;}

int* ReversP(int *a,int n) { int k; for (int i=0;i<n/2;i++) { k=*(a+i); *(a+i)=*(a+n-i-1); *(a+n-i-1)=k; } return a; }

int* ReversL(int *a,int n) { for (int i=0;i<n/2;i++) { *(a+i)^=*(a+n-i-1); *(a+n-i-1)^=*(a+i); *(a+i)^=*(a+n-i-1); } return a; }

12.10. Алгоритмы расширение и сжатие массивов

При обработке массивов можно вставлять и удалять элементы void MoveRight(int * a, int n, int num) { //сдвигает все элементы на одну позицию вправо до номера num for (int i=n; i>=(num+1); i--) a[i]=a[i-1]; }

void MoveLeft(int * a,int *n, int num) { //сдвигает все элементы на одну позицию влево c номера num for (int i=num; i<*n-1; i++) a[i]=a[i+1]; *n=*n-1; }

int* DeleteCh(int *a,int *n, int item)

{

int i=0;

while (i<*n)

{

if (a[i]==item)

{

MoveLeft(a, n, i);

//Сдвигаем и удаляем элемент a=(int*)realloc(a,(*n)*sizeof(int));

i-- ;

}

i++;

}

return a;}

int* InsertCh(int *a,int *n)

{ int i=0;

while (i<*n)

{

if (a[i]%2==0)

{

a=(int *)realloc(a,(*n+1)*sizeof(int));

MoveRight(a,(*n)++,i+1); //Сдвигаем и добавляем элемент

a[i+1]=a[i];

i++ ;

}

i++;

}

return a;

}

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