Усі змінні потрібно оголосити до їхнього використання, хоч деякі оголошення можна зробити непрямо, через зміст. Оголошення вказує тип і містить список з однієї або більше змінних цього типу, як, наприклад
int lower, upper, step;
char c, line[1000];
Змінні можна розподілити поміж оголошень у будь-який спосіб; списки вище так само можна було б записати як
int lower;
int upper;
int step;
char c;
char line[1000];
Остання форма забирає більше місця, але вигідна тим, що дозволяє додати коментар до кожного оголошення, для пізніших змін.
Змінну можна також ініціювати (надати їй початкового значення) під час її оголошення. Якщо за назвою слідує знак рівності та вираз, цей вираз служитиме ініціалізатором, як, скажімо
char esc = '\\';
int i = 0;
int limit = MAXLINE+1;
float eps = 1.0e-5;
Якщо змінна не є автоматичною, ініціалізація відбудеться тільки один раз, за задумом — до того як програма почне своє виконання, але ініціалізатор має бути сталим виразом. Явно ініційована автоматична змінна, започатковується кожного разу при входженні у функцію або блок коду де вона знаходиться; ініціалізатор може складатися з будь-якого виразу. Зовнішні та статичні змінні, поза вибором, ініціалізуються до нуля. Автоматичні змінні, які не мають явного ініціалізатора, отримають невизначене значення (тобто непотріб).
Для вказівки того, що значення змінної не змінюватиметься, до оголошення можна додати класифікатор const. У випадку масивів, класифікатор const вказує на те, що елементи масиву залишатимуться незмінними.
const double e = 2.71828182845905;
const char msg[] = "warning: ";
Оголошення з const можуть також вживатися з масивами в якості аргументів, щоб вказати на те, що функція, скажімо, не змінює масиву:
int strlen(const char[]);
Якщо відбудеться спроба змінити значення змінної типу const, результат такої дії залежатиме від реалізації.