Какие аргументы принимает оператор sizeof в C? - PullRequest
2 голосов
/ 13 октября 2009

[ Оригинальное название относится к 'sizeof function'. ]

Я попробовал это, и все они работали:

char *p;

printf("Size of *p is %d\n",sizeof(*p));  //result =1
printf("Size of  p is %d\n",sizeof( p));  //result =4
printf("Size of  p is %d\n",sizeof(&p));  //result =4

Интересно, почему первый printf равен 1, 2-й и 3-й - 4? Итак, какие аргументы может принять sizeof?

Ответы [ 10 ]

10 голосов
/ 13 октября 2009

sizeof это не функция, это ключевое слово. Вы можете отказаться от скобок, и это будет работать просто отлично. Поскольку это не функция, она работает с любым типом или объектом, который вы ей даете, - она ​​гораздо более гибкая, чем функция.

8 голосов
/ 13 октября 2009

sizeof не является функцией; это оператор. Его можно использовать двумя способами: как sizeof(typename) и как sizeof expression. Скобки обязательны при использовании с именем типа. Скобки не нужны, когда операндом является выражение, хотя для ясности многие программисты будут заключать в скобки выражение независимо. Обратите внимание, что в отличие от большинства операторов языков программирования, sizeof expression не не оценивает свой аргумент при нормальных обстоятельствах, то есть когда его операнд не является массивом переменной длины C99.

5 голосов
/ 13 октября 2009

Требуется тип.

sizeof(char) всегда один. Переменная p сама является указателем, и на вашей платформе она имеет размер 4. Затем вы делаете &p, или указатель на указатель, который также имеет размер 4.

В большинстве современных настольных систем 32-разрядная архитектура будет иметь 4-байтовые указатели, а 64-разрядная архитектура будет иметь 8-байтовые указатели.

sizeof само по себе является ключевым словом, разрешенным во время компиляции, а не функцией. В C99 массивы могут иметь переменную длину, а sizeof будет ожидать выполнения во время выполнения, чтобы разрешить этот размер.

2 голосов
/ 13 октября 2009

Поскольку вы работаете на 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**
1 голос
/ 26 октября 2010

Также обратите внимание:

sizeof 'a' == 1   // C++ 

но

sizeof 'a' == 4   /* C */ 

(Если быть точным, sizeof 'a' == sizeof (int) в C, опубликованный pmg).

В C буква 'a' повышается до int, прежде чем она будет вычислена. Одна из немногих несовместимостей между двумя языками.

0 голосов
/ 09 июня 2013
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.
0 голосов
/ 13 октября 2009

Операндом оператора 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); */
0 голосов
/ 13 октября 2009

В дополнение к другим ответам, остерегайтесь возможных терминологических ошибок.

В мире Си, байт - это то же самое, что и символ. То есть каждый 'char' равен 1 'байту' по определению. Это значение «байт» не обязательно связано с «байтом» машины в базовом оборудовании. C 'байт' (то есть 'char') может состоять из нескольких машинных 'байтов'. Однако в C-программе у вас нет доступа к машинным байтам. Все измеряется в C «байтах» (то есть в «chars»), а «sizeof» дает размер, измеренный в «chars».

По этим причинам sizeof (char) всегда равен 1, независимо от того, из каких машинных байтов фактически состоит каждый char.

0 голосов
/ 13 октября 2009

Первый ответ говорит, что символ равен 1 байту. (разыменование вашего указателя на фактические данные символа)

Второй говорит, что значение указателя является 4-байтовым значением, то есть ячейка памяти представлена ​​4-байтовым значением.

Третий говорит, что адрес указателя является 4-байтовым значением.

Размер может принимать все эти аргументы, и он сообщает точный ответ для всех значений.

Приветствие.

0 голосов
/ 13 октября 2009
sizeof (char)   = 1
sizeof (void *) = 4

Первый - 1, потому что вы передаете символ. (р указывает на символ) 2-й и 3-й вызовы получают объект char * / void *, поэтому они выдают 4.

...