C установка IDE C структура програми C змінні C типи даних С функція printf C константи C арифметичні операції C операції порівняння і логічні операції C порозрядні операції C операції присвоювання C перетворення типів C умовні конструкції C цикли С масиви і рядки С функція scanf C препроцесор. Директива #include C #define директива C макроси C умовна компіляція C функції. Визначення та опис функцій C функції. Передача параметрів в функцію C функції. Повернення результату з функції C функції. Рекурсивні функції C область видимості змінних C зовнішні об'єкти C вказівники C вказівник. Операції з вказівниками C покажчики. Арифметика покажчиків C покажчики. Константи і покажчики C покажчики. Покажчики та масиви C покажчики. Масиви покажчиків, рядки і багаторівнева адресація C покажчики. Покажчики в параметрах функції C покажчики. Динамічна пам'ять C покажчики. Покажчик як результат функції C покажчики. Управління динамічної пам'яттю C покажчики. Покажчики на функцію C покажчики. Покажчики на функції як параметри і результати функцій C покажчики. Функції зі змінною кількістю параметрів C struct. Визначення структур C struct. Структури як елементи структур C struct. Покажчики на структури C struct. Масиви структур C struct. Структури і функції C struct. union об'єднання C struct. Бітові поля С file. Введення-виведення і робота з файлами C file. Читання і запис бінарних файлів C file. Читання і запис структур в файл C file. Читання і запис текстових файлів C file. Форматування вводу-виводу C file. Позиціонування в потоці C file. Консольне введення-виведення

C покажчики. Покажчик як результат функції


У минулій темі розглядалися такі функції, як calloc, malloc, realloc, які повертали в якості результату покажчик. Тобто функція може не приймати покажчики як параметри, але і повертати покажчик. Визначення подібної функції виглядає наступним чином:

тип *імя_функції (параметри) 
{
    // тіло функції
    тип *імя_покажчика;
    return  імя_покажчика;
}

Перевагою використання покажчика як повертається типу є те, що це дозволяє отримувати з функції набір значень, зокрема, масив. Наприклад, нехай у нас в програмі є два масиви, і ми хочемо їх скласти за допомогою спеціальної функції:

#include <stdio.h>
#include <stdlib.h>
 
int *addArrays(int a[], int b[], int n) 
{
    int *ptr = calloc(n, sizeof(int)); 
 
     for (int i = 0; i < n; i++)
        ptr[i] = a[i] + b[i];
 
     return ptr;
}
 
int main(void)
{
    int a[] = {3,4,5,6,7};
    int b[] = {1,1,1,1,1};
 
    int n = sizeof(a)/sizeof(a[0]);
    int *ptr = addArrays(a, b, n);
    for(int i=0;i<n;i++)
        printf("%d \t", *ptr++);
    free(ptr);
    return 0;
}

Функція addArrays() для зберігання результатів складання двох масивів виділяє динамічну пам'ять, на яку вказує покажчик ptr. Потім ця динамічна пам'ять наповнюється результатами складання відповідних елементів двох масивів. А повертається значенням служить покажчик ptr.

У функції main ми можемо отримати повертається покажчик і перебрати всі значення з динамічної пам'яті:

int *ptr = addArrays(a, b, n);
for(int i=0;i<n;i++)
    printf("%d \t", *ptr++);

Коли покажчик стає не потрібен, раніше виділена динамічна пам'ять звільняється за допомогою функції free() .

Результатом роботи програми буде наступний висновок:

int *addArrays(int a[], int b[], int n) 
{
    int ptr[n];
    for (int i = 0; i < n; i++)
        ptr[i] = a[i] + b[i];
 
    return ptr;
}

Однак ми навіть не зможемо скомпілювати даний приклад, так як масив ptr тут поставлено як локальна змінна.


Наш партнер:
beta test mp3 playlist downloader