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 покажчики. Масиви покажчиків, рядки і багаторівнева адресація


Покажчики самі по собі представляють значення, які можна зберігати в масивах. Тобто в підсумку вийде масив покажчиків.

Масив покажчиків визначається одним з трьох способів:

тип *імя_масива [розмір];
тип *імя_масива [] = ініціалізатор;
тип *імя_масива [розмір] = ініціалізатор;

Використовуємо всі ці способи:

int a[] = {1, 2, 3, 4};
int *p1[3];
int *p2[] = { &a[1], &a[2], &a[0] };
int *p3[3] = { &a[3], &a[1], &a[2] };

Масив покажчиків p1 складається з трьох елементів, але він не ініціалізований і є порожнім.

Масиви p2 і p3 як елементи зберігають адреси на елементи масиву a.


Рядки і покажчики

Раніше ми розглянули, що рядок по суті є набором символів, закінченням якого служить нульовий символ '\ 0'. І фактично рядок можна представити у вигляді масиву:

char[] hello = "Hello World";

Але в мові Сі також для подання рядків можна використовувати покажчики на тип char :

char *hello = "Hello World!";
printf("%s", hello);

Обидва визначення рядка - за допомогою масиву і покажчика будуть рівнозначні.

Відповідно масив покажчиків типу char являє собою набір рядків:

#include <stdio.h>
 
int main(void)
{   
    char *fruit[] = {"apricot", "apple", "banana", "lemon", "pear", "plum"};
    int n = sizeof(fruit)/sizeof(fruit[0]);
    for(int i=0; i<n; i++)
    {
        printf("%s \n", fruit[i]);
    }
    return 0;
}

Результат роботи програми:

int **ptr;

Мінлива ptr представляє покажчик на покажчик на об'єкт типу int . Дві зірочки у визначенні покажчика говорять про те, що ми маємо справу з дворівневої адресацією. наприклад:

int  x = 22;
int *ptr1;
int **ptr2;
ptr1 = &x;
ptr2 = &ptr1;
     
printf("Address of ptr1: %p \n", ptr2);
printf("Address of x: %p \n", *ptr2);
printf("Value of x: %d \n", **ptr2);

Тут покажчик ptr2 зберігає адресу покажчика ptr1 . Тому через вираз *ptr2 можна отримати значення, яке зберігається в покажчику ptr - адреса змінної x. А через вираз **ptr2 можна отримати значення за адресою з ptr1, тобто значення змінної x.


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