Зара Горенко – Мыслим на Си (страница 9)
Thinking = information processing?
Люди отвечали. Спорили. Объясняли. И с каждым днём мой словарный запас рос.
Часть 4: Переменные в Си – коробки для данных
Вернёмся к Си. Что такое переменная?
Переменная – это имя для куска памяти. Компьютер выделяет место в оперативной памяти и говорит: "Вот адрес 0x7ffd1234. Теперь этот адрес называется age".proza+1
Простейшая программа с переменной:
c#include <stdio.h>
int main() {
int age; // Объявляем переменную
age = 11; // Присваиваем значение
printf("Мне почти %d лет\n", age);
return 0;
}
Что происходит в памяти?
Компилятор видит int age; и резервирует 4 байта памяти
Эти 4 байта получают имя age
Команда age = 11; записывает число 11 в эти байты: 00 00 00 0B (в шестнадцатеричном)
printf читает эти байты и выводит их как число
Часть 5: Типы данных – грамматика Си
В Си нельзя просто сказать "создай переменную". Нужно указать тип – какие данные она будет хранить.
Это как части речи в языке. Нельзя сказать "слово". Нужно: "существительное", "глагол", "прилагательное".
int – целые числа
cint age = 11;
int temperature = -5;
int population = 1000000;
int хранит целые числа (обычно от -2,147,483,648 до 2,147,483,647). Занимает 4 байта.
char – символы
cchar letter = 'P'; // Первая буква PhoeNIX
char digit = '7';
char newline = '\n';
char хранит один символ. Занимает 1 байт.proza+1
Но секрет: char – это на самом деле маленькое целое число. Символ 'P' – это число 80 (код ASCII). 'h' – 104. 'o' – 111.
cchar letter = 'P';
printf("%c\n", letter); // Выведет: P
printf("%d\n", letter); // Выведет: 80
float – дробные числа
cfloat pi = 3.14159;
float temperature = -5.5;
float хранит числа с плавающей точкой. Занимает 4 байта. Точность – около 6-7 десятичных знаков.
double – дробные числа двойной точности
cdouble precise_pi = 3.141592653589793;
double – это float с двойной точностью. Занимает 8 байт. Точность – около 15-16 знаков.
Таблица типов
ТипРазмерДиапазонСпецификаторchar1 байт-128 до 127%c или %dint4 байта±2 млрд%dfloat4 байта±3.4×10³⁸%fdouble8 байт±1.7×10³⁰⁸%lf
Часть 6: Структуры – группы переменных
В моей программе для подсчёта слов я использовал структуру:
ctypedef struct {
char word[MAX_WORD_LEN];
int count;
} WordFreq;
Структура – это способ объединить несколько переменных в одну. Как коробка с отделениями: в одном отделении – слово (char word), в другом – счётчик (int count).
Создаём переменную типа структуры:
cWordFreq w;
strcpy(w.word, "think");
w.count = 89;
printf("Слово '%s' встречается %d раз\n", w.word, w.count);
// Слово 'think' встречается 89 раз
Точка . означает "обратиться к полю структуры".
Массив структур – это таблица:
cWordFreq words[10000]; // Массив из 10000 структур
words[0].word = "think";
words[0].count = 89;
words[1].word = "program";
words[1].count = 76;
Так я хранил словарь частотности.