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 вказівник. Операції з вказівниками


Покажчики в мові Сі підтримують ряд операцій: присвоювання, отримання адреси вказівника, отримання значення за вказівником, деякі арифметичні операції і операції порівняння.


Присвоєння

Вказівникам можна привласнити адресу об'єкта того ж типу, якесь значення іншого покажчика або константу NULL .

Присвоєння вказівнику адреси вже розглядалося в минулій темі. Для отримання адреси об'єкта використовується операція & :

int a = 10;
int *pa = &a;   // вказівник pa зберігає адресу змінної a

Причому вказівник і змінна повинні мати той же тип, в даному випадку int .

Присвоєння вказівнику іншого вказівника:

#include <stdio.h>
 
int main(void)
{
    int a = 10;
    int b = 2;
     
    int *pa = &a;
    int *pb = &b;
     
    printf("Variable a: address=%p \t value=%d \n", pa, *pa);
    printf("Variable b: address=%p \t value=%d \n", pb, *pb);
     
    pa = pb;    // тепер вказівник pa зберігає адресу змінної b
    printf("Variable b: address=%p \t value=%d \n", pa, *pa);
     
    return 0;
}

Коли вказівником присвоюється інший вказівник, то фактично перший вказівник починає також вказувати на ту ж адресу, на який вказує другий вказівник.

Якщо ми не хочемо, щоб вказівник вказував на якусь конкретну адресу, то можна привласнити йому умовне нульове значення за допомогою константи NULL , яка визначена в заголовку stdio.h :

int *pa = NULL;

розіменування вказівника

Операція разіменування вказівник у вигляді *імя_вказівника , дозволяє отримати об'єкт за адресою, який зберігається у вказівнику.

#include <stdio.h>
 
int main(void)
{
    int a = 10;
     
    int *pa = &a;
    int *pb = pa;
     
    *pa = 25;
     
    printf("Value on pointer pa: %d \n", *pa);  // 25
    printf("Value on pointer pb: %d \n", *pb);  // 25
    printf("Value of variable a: %d \n", a);    // 25
     
    return 0;
}

Через вираз *pa ми можемо отримати значення за адресою, який зберігається у вказівнику pa , а через вираз типу *pa = значення вкласти в цю адресу нове значення.

І так як в даному випадку вказівник pa вказує на змінну a , то при зміні значення за адресою, на який вказує вказівник, також зміниться і значення змінної a .


Адреса вказівника

Вказівник зберігає адресу змінної, і за цією адресою ми можемо отримати значення цієї змінної. Але крім того, вказівник, як і будь-яка змінна, сам має адресу, за якою він розташовується в пам'яті. Цю електронну адресу можна отримати також через операцію & :

int a = 10;
int *pa = &a;
printf("address of pointer=%p \n", &pa);        // адреса вказівника
printf("address stored in pointer=%p \n", pa);  // адреса, яка зберігається у вказівнику - адреса переменной a         
printf("value on pointer=%d \n", *pa);          // значення по адресі у вказівнику - значення переменной a

операції порівняння

До вказівників можуть застосовуватися операції порівняння > , > = , < , <= , == , ! = . Операції порівняння застосовуються тільки до вказівників одного типу і константі NULL . Для порівняння використовуються номери адрес:

int a = 10;
int b = 20;
int *pa = &a;
int *pb = &b;
if(pa > pb)
    printf("pa (%p) is greater than pb (%p) \n", pa, pb);
else
    printf("pa (%p) is less or equal pb (%p) \n", pa, pb);

Консольний вивід в моєму випадку:

char c = 'N';
char *pc = &c;
int *pd = (int *)pc;
printf("pc=%p \n", pc);
printf("pd=%p \n", pd);

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