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 область видимості змінних


Кожна змінна має певну область видимості (scope). Область видимості представляє ділянку програми, в рамках якого можна використовувати змінну.

Змінні бувають глобальними і локальними або автоматичними.


Глобальні змінні

Глобальні змінні визначені в файлі програми поза функціями і можуть використовуватися будь-якою функцією.

#include <stdio.h>
 
int n = 5;         // глобальна змінна
 
void printn()
{
    n++;
    printf("n=%d \n", n);
}
 
int main(void)
{
    printn();               // n=6
    n++;
    printf("n=%d \n", n);   // n=7
     
    return 0;
}

Тут змінна n є глобальною і доступна з будь-якої функції. При цьому будь-яка функція може змінити її значення.


локальні змінні

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

#include <stdio.h>
 
void printn()
{
    int n = 63;     // локальна змінна
    n++;
    printf("n=%d \n", n);
}
 
int main(void)
{
    int a = 2;      // локальна змінна
    printn();               // n=64

    //n++;      так зробити неможна, так як n визначена в функції printn

    printf("a=%d \n", a);   // a=2
    return 0;
}

Тут у функції printn визначена локальна змінна n . У функції main визначена локальна змінна a . Поза своїх функцій змінні недоступні. Наприклад, ми не можемо використовувати змінну n в функції main , так як її область видимості обмежена printn .

До автоматичних змінних може застосовуватися ключове слово auto :

auto int a = 2;

Хоча це не є обов'язковим, так як будь-яка змінна, задана на рівні функції або блоку коду, вже вважається автоматичною.


приховування змінних

Локальні змінні, визначені всередині блоку коду, можуть приховувати зовнішні змінні з тим же ім'ям:

#include <stdio.h>
 
int n = 5;                      // глобальна змінна
 
int main(void)
{
    int n = 10;                 // локальна змінна

    printf("n=%d \n", n);       // n=10
     
    {
        int n = 20;             // локальна змінна
        printf("n=%d \n", n);   // n=20
    }
    return 0;
}

Тут визначено три змінних з ім'ям n . Локальна змінна n , задана на рівні функції main ( int n = 10; ) приховує глобальну змінну n .

А змінна n , задана на рівні блоку, приховує змінну, задану на рівні функції main .


статичні змінні

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

Наприклад, нехай у нас буде функція зі стандартною локальною змінною:

#include <stdio.h>
 
void display()
{
    int i = 0;             // локальна змінна
    i++;
    printf("i=%d \n", i);     // i = 1
}
 
int main(void)
{
    display();   // i = 1
    display();   // i = 1
    display();   // i = 1

    return 0;
}

// RESULT:
/*
i = 1
i = 1
i = 1
*/

Функція display викликається три рази, і при кожному виклику програма повторно виділятиме пам'ять для змінної i , яка визначена в функції. А після завершення роботи функції display , пам'ять для змінної i буде звільнятися. Відповідно її значення при кожному виклику буде незмінним.

Тепер зробимо змінну i статичною:

#include <stdio.h>
 
void display()
{
    static int i = 0;         // статична змінна

    i++;
    printf("i=%d \n", i);
}
 
int main(void)
{
    display();   // i = 1
    display();   // i = 2
    display();   // i = 3

    return 0;
}

// RESULT:
/*
i = 1
i = 2
i = 3
*/

До змінної було додано ключове слово static , тому при завершенні роботи функції display змінна не знищується, вона очищується, навпаки, вона зберігається в пам'яті. І відповідно результат роботи програми буде іншим.


реєстрові змінні

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

Ключове слово register застосовується до змінних:

register int x = 8;

І до параметрів функції:

void display(register int a)
{
    printf("a=%d \n", a);
}

Однак використання слова register ще не є гарантією, що змінна дійсно буде поміщена в регістр, так як багато залежить від апаратної частини комп'ютера і встановлених для неї обмежень. У той же час якщо апаратні можливості не підтримують реєстрових змінних, то слово register просто буде ігноруватися, і його використання не викличе помилку.


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