Работа с памятью " на низком уровне"
Операции преобразования типа указателя и адресной арифметики дают Си невиданную для языков высокого уровня свободу действий по управлению памятью (в смысле ее распределения). Традиционно языки программирования, даже если они работают с указателями или с их неявными неявными эквивалентами (ссылками), не могут выйти за пределы единожды определенных типов данных для используемых в программе переменных. Напротив, в Си имеется возможность работать с памятью на " низком" уровне (можно сказать, ассемблерном или архитектурном). На этом уровне программист имеет дело не с переменными, а с помеченными областями памяти, внутри которых он может размещать данные любых типов и в любой последовательности, в какой только пожелает. Естественно, что при этом ответственность за корректность размещения данных ложится целиком на программиста. Незаменимым помошником в этой процедуре является операция sizeof.
Операция sizeof вызывает подстановку транслятором соответствующего значения размерности указанного в ней типа данных в байтах. С этой точки зрения она является универсальным измерителем, который должен использоваться для корректного размещения данных различных типов в памяти. Сказанное проиллюстрируем простым примером размещения переменных типа double в массиве байтов типа char - размерность массива вещественных переменных вычисляется, исходя из размерности вещественой переменной и размерности массива байтов:
#define N 40
double *d;
char A[N];
for (i=0, d=( double*)A; i < N / sizeof(double); i++)
d[i] = (double)i;
Заметим, что использование операции sizeof позволяет сделать программу переносимой, то есть нечувствительной к разрядности представления данных в различных трансляторах.