Результатом операции является значение, на которое указывает операнд. Типом результата является тип, ассоциированный с этим указателем. Если указателю перед операцией не было присвоено никакого значения, то результат непредсказуем.
Примеры:
int *ра, х;
int a[20];
double d;
pa = &а[5]; /* пример 1 */
x = *ра; /* пример 2 */
if ( х == *&x ) /* пример 3 */
printf("BEPHO\n");
d =*(double *)(&x); /* пример 4 */
В первом примере операция адресации вырабатывает адрес шестого (по порядку следования) элемента массива а. Результат записывается в адресную переменную (указатель) ра.
Во втором примере используется операция косвенной адресации для доступа к значению типа int, адрес которого хранится в указателе ра. Результат присваивается целой переменной х.
В третьем примере будет печататься слово ВЕРНО. Пример демонстрирует симметричность операций адресации и косвенной адресации: *&хэквивалентно х.
Четвертый пример показывает полезное приложение этого свойства. Адрес хпреобразуется операцией приведения типа к типу указатель на double. К полученному указателю применяется операция косвенной адресации. Результатом выражения является значение типа double.
Операция sizeof
Операция sizeofопределяет размер памяти, который соответствует объекту или типу. Операция sizeofимеет следующий вид:
sizeof < выражение >
sizeof (< абстрактное имя типа >)
Операндом является либо < выражение >, либо абстрактное имя типа в скобках. Результатом операции sizeofявляется размер памяти в байтах, соответствующий заданному объекту или типу. Тип результата — unsigned int. Если размер объекта не может быть представлен значением типа unsigned int(например, в СП MSC допустимы массивы типа hugeразмером более 64 Кбайтов), то следует использовать приведение типа:
(long) sizeof < выражение >
В СП MSC версии 4 допустимым выражением является L-выражение, а в версии 5 и в СП ТС — произвольное выражение. Следует учитывать, что само < выражение > не вычисляется, т. к. операция sizeofвыполняется на этапе компиляции программы. Для нее существен только тип результата < выражения >, а не его значение. Недопустим тип void. Применение операции sizeofк идентификатору функции в СП ТС считается ошибкой, а в СП MSC эквивалентно определению размера указателя на функцию.
Если операция sizeofприменяется к идентификатору массива, то результатом является размер всего массива в байтах, а не размер одного элемента.
Если операция sizeofприменяется к типу структуры или объединения либо к идентификатору, имеющему тип структура или объединение, то результатом является фактический размер в байтах структуры или объединения, который может включать и участки пространства, используемые для выравнивания элементов структуры или объединения на границы слов памяти. Таким образом, этот результат может превышать размер, вычисленный путем сложения размеров отдельных элементов структуры. Например, если объявлена следующая структура
struct {
char m[3][3];
} s;
то значение sizeof(s.m)будет равно 9, а значение sizeof(s)будет равно 10.
Используя операцию sizeofдля ссылок на размеры типов данных (которые могут различаться для разных компьютеров), можно повысить переносимость программы. В следующем примере операция sizeofиспользуется для спецификации размера типа intв качестве аргумента стандартной функции распределения памяти calloc. Значение, возвращаемое функцией (адрес выделенного блока памяти), присваивается переменной buffer.
buffer = calloc(100, sizeof(int));
Мультипликативные операции
К мультипликативным операциям относятся операции умножения *, деления / и получения остатка от деления %. Операндами операции % должны быть целые значения. Операции умножения * и деления / выполняются над целыми и плавающими операндами. Типы первого и второго операндов могут отличаться, при этом выполняются преобразования операндов по умолчанию. Типом результата является тип операндов после преобразования.
В процессе выполнения мультипликативных операций ситуация переполнения или потери значимости не контролируется. Если результат мультипликативной операции не может быть представлен типом операндов после преобразования, то информация теряется.
Читать дальше