Какие аргументы принимает оператор sizeof в C?
[ Оригинальное название относится к 'sizeof function'. ]
Я попробовал это, и все они работали:
char *p; printf ("Размер *p равен%d\n",sizeof(*p)); // результат =1 printf("Размер p%d\n",sizeof( p)); // результат =4 printf("Размер p%d\n",sizeof(&p)); // результат = 4
Интересно, почему первый printf равен 1, 2-й и 3-й - 4? Так какие же аргументы может принять sizeof?
10 ответов
Требуется тип.
sizeof(char)
всегда один. Переменная p
сам по себе является указателем, и на вашей платформе, которая имеет размер 4. Затем вы делаете &p
или указатель на указатель, который также имеет размер 4.
В большинстве современных настольных систем 32-разрядная архитектура будет иметь 4-байтовые указатели, а 64-разрядная архитектура будет иметь 8-байтовые указатели.
sizeof
само по себе является ключевым словом, разрешенным во время компиляции, а не функцией. В C99 массивы могут иметь переменную длину, а size of будет ожидать выполнения во время выполнения, чтобы разрешить этот размер.
sizeof
это не функция, это ключевое слово. Вы можете отказаться от скобок, и это будет работать просто отлично. Поскольку это не функция, она работает с любым типом или объектом, который вы ей даете, - она гораздо более гибкая, чем функция.
sizeof
не является функцией; это оператор. Его можно использовать двумя способами: как sizeof(typename)
и в качестве sizeof expression
, Скобки обязательны при использовании с именем типа. Скобки не нужны, когда операндом является выражение, хотя для ясности многие программисты будут заключать это выражение в скобки независимо. Обратите внимание, что в отличие от большинства операторов языков программирования, sizeof expression
не оценивает свой аргумент при нормальных обстоятельствах, т. е. когда его операнд не является массивом переменной длины C99.
Поскольку вы работаете на 32-битной машине.
*p is a character == 1 byte.
p is a pointer == 4 bytes.
&p is an address of a pointer == 4 bytes. Same as char**
Также обратите внимание:
sizeof 'a' == 1 // C++
но
sizeof 'a' == 4 /* C */
(Чтобы быть точным, sizeof 'a' == sizeof(int) в C, как отправлено pmg).
В C "a" переводится в int, прежде чем оно будет вычислено. Одна из немногих несовместимостей между двумя языками.
sizeof (char) = 1
sizeof (void *) = 4
Первый - 1, потому что вы передаете символ. (p указывает на символ) 2-й и 3-й вызовы получают объект char* / void*, поэтому они дают 4.
Первый ответ говорит, что символ равен 1 байту. (разыменование вашего указателя на фактические данные символа)
Второе говорит, что значение указателя является 4-байтовым значением, то есть ячейка памяти представлена 4-байтовым значением.
Третий говорит, что адрес указателя является 4-байтовым значением.
Размер может принимать все эти аргументы, и он сообщает точный ответ для всех значений.
Приветствия.
Операнд sizeof
Оператор типа.
Если вы используете sizeof с объектом или значением, вместо него используется его тип.
sizeof 65; /* same as `sizeof (int);` */
sizeof 'X'; /* same as `sizeof (int);` */
sizeof 42.0; /* same as `sizeof (double);` */
float f;
sizeof f; /* same as `sizeof (float);` */
/* etc ... */
Вы можете указать тип непосредственно в операторе sizeof (как в "такой же как" выше). Скобки необходимы для "приведения операнда к нужному типу" (как в (int)2.5
), а не как синтаксис sizeof
сам
#include <math.h>
sizeof (12 * log(100)); /* same as `sizeof (double);` */
/* without the parenthesis, this would be */
/* (sizeof 12) * log(100); */
В дополнение к другим ответам, остерегайтесь возможной путаницы в терминологии.
В мире Си байт - это то же самое, что и символ. Т.е. каждый 'char' равен 1 'байту' по определению. Это значение "байт" не обязательно связано с "байтом" машины в базовом оборудовании. "Байт" A C (то есть "char") может состоять из нескольких машинных "байтов". Однако в C-программе у вас нет доступа к машинным байтам. Все измеряется в C "байтах" (то есть в "chars"), а "sizeof" дает вам размер, измеренный в "chars".
По этим причинам sizeof (char) всегда равен 1, независимо от того, из каких машинных байтов фактически состоит каждый char.
Size of operator show the size of which data type we used
#include<stdio.h>
int main()
{
int a;
float b;
char c;
double d;
printf("%d",sizeof(a));
printf("%d",sizeof(a));
printf("%d",sizeof(a));
printf("%d",sizeof(a));
}
Answer a=4;
b=4;
c=1;
d=8
If you are using 8 bit compiler.