当我问他什么时,this question的作者对我很开心
sizeof * q
确实......
他告诉我这是一个非常基本的C问题,我应该检查一下。
但是当我环顾四周并且之前没有见过有人问过时,我现在就自己做了:
C中的sizeof
在没有括号和/或类型的情况下使用了什么?
答案 0 :(得分:21)
因此,如果我们在C99 draft standard部分sizeof
一元运算符段 1 中查看6.5.3
的语法,那么它就是如下:
sizeof unary-expression
sizeof ( type-name )
如果没有括号,您不能使用类型名称并且6.5.3.4
部分<运营商段落 2 说(强调我的):
sizeof运算符产生其操作数的大小(以字节为单位),可以是 表达式或类型的带括号的名称。[...]
为了完整起见,您可能想知道如果我们有括号并且答案是肯定的,我们是否可以将sizeof
与表达式一起使用,因为一元表达式本身可以包含括号。最简单的方法是查看标准草案中的A.2.1
表达式部分,并像这样处理语法:
unary-expression -> postfix-expression -> primary-expression -> ( expression )
答案 1 :(得分:19)
sizeof
是一个运算符,而不是一个函数,因此如果操作数是一个表达式(但通常使用它们),则不需要()
。 sizeof * q == sizeof(*q)
。请注意,如果操作数是一种类型,则需要使用()
,因此sizeof(int)
(请参阅例如http://en.wikibooks.org/wiki/C_Programming/Reference_Tables)
sizeof sizeof operator for expressions sizeof 123
sizeof() sizeof operator for types sizeof (int)
现在即使wiki充满了关于C的信息......世界正在快速变化: - )
sizeof运算符用于确定指定数据类型在内存中占用的空间量。要使用sizeof,关键字“sizeof”后跟类型名称或表达式(可能只是变量名称)。如果使用类型名称,则必须始终将其括在括号中,而可以使用括号或不使用括号指定表达式。
答案 2 :(得分:7)
sizeof
是运算符,特别是一元运算符,如一元&
或++
。它采用一元表达式或由parens包围的类型名称作为其操作数。
语法是
sizeof unary-expression sizeof ( type-name )
所以,给出像
这样的声明int *q;
表达式sizeof *q
和sizeof (int)
是等效的,sizeof q
和sizeof (int *)
也是如此。
答案 3 :(得分:3)
与sizeof with parantheses相同。它是一个右侧的一元运算符,因此它将其正确的大小视为操作数
据我所知,当使用sizeof和基本数据类型时,必须使用paranthesis。
当您拥有变量int a
时,您可以双向检查其大小,但不必强制执行:sizeof a
,sizeof (a)
的工作方式相同。
但是当检查int本身的大小时,只有sizeof (int)
才有效。
答案 4 :(得分:3)
它与parens一样 - 它返回传递它的任何大小,在这种情况下是q
所指向的大小。
虽然这有点不太清楚,尤其是当我们参与到malloc
和sizeof
的复杂调用时,所以我认为最好始终使用parens。