2

[原标题提到'sizeof函数'。]

我尝试了这些,它们都起作用了:

字符 *p;

printf("*p 的大小为 %d\n",sizeof(*p)); //结果=1
printf("p 的大小为 %d\n",sizeof(p)); //结果=4
printf("p 的大小为 %d\n",sizeof(&p)); //结果=4

我想知道为什么第一个 printf 是 1,第二个和第三个是 4?那么 sizeof 实际上可以接受哪些参数呢?

4

10 回答 10

10

sizeof不是函数,而是关键字。你可以去掉括号,它会工作得很好。因为它不是一个函数,所以它适用于你给它的任何类型或对象——它比函数灵活得多。

于 2009-10-12T22:51:40.343 回答
8

sizeof不是函数;它是一个运算符。它可以以两种方式使用: assizeof(typename)和 as sizeof expression。与类型名称一起使用时,括号是必需的。当操作数是表达式时,不需要括号,尽管为了清楚起见,许多程序员无论如何都会给表达式加上括号。请注意,与大多数编程语言运算符不同,在正常情况下(即,当其操作数不是 C99 可变长度数组时)不会sizeof expression计算其参数。

于 2009-10-12T22:53:42.307 回答
5

它需要一个类型。

sizeof(char)总是一个。变量p本身是一个指针,在你的平台上它的大小为 4。然后你做&p,或者一个指向指针的指针,它的大小也为 4。

在大多数现代桌面系统上,32 位体系结构将具有 4 字节指针,而 64 位体系结构将具有 8 字节指针。

sizeof本身是一个关键字,在编译时解析,而不是一个函数。在 C99 中,数组可以是可变长度的,并且 sizeof 将等到运行时来解析这个大小。

于 2009-10-12T22:50:46.993 回答
2

因为您正在使用 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**
于 2009-10-12T22:51:18.253 回答
1

另请注意:

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

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

(准确地说,pmg 发布的 C 中的 sizeof 'a' == sizeof(int))。

在 C 中,“a”在被评估之前被提升为 int。两种语言之间为数不多的不兼容之一。

于 2010-10-25T22:36:59.203 回答
0

运算符的操作数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); */
于 2009-10-12T23:53:00.690 回答
0

除了其他回复之外,请注意可能的术语混淆。

在 C 世界中,“字节”与“字符”相同。即根据定义,每个“字符”是 1 个“字节”。“字节”的这个含义不一定与底层硬件中的机器“字节”相关联。AC“字节”(即“字符”)可以由多个机器“字节”组成。但是,在 C 程序中,您无法访问机器字节。一切都以 C 的“字节”(即“字符”)为单位,“sizeof”给出了以“字符”为单位的大小。

由于这些原因,无论每个 'char' 实际包含多少机器字节,'sizeof(char)' 始终为 1。

于 2009-10-12T23:06:45.103 回答
0
sizeof (char)   = 1
sizeof (void *) = 4

第一个是 1 因为你传递了一个字符。(p 指向一个 char)第 2 次和第 3 次调用接收一个 char* / void* 对象,因此它们产生 4。

于 2009-10-12T22:50:47.913 回答
0

第一个答案是 char 是 1 个字节。(取消指向实际 char 数据的指针)

第二种是说指针值是一个4字节的值,即内存位置用一个4字节的值来表示。

第三个是说指针的地址是一个4字节的值。

Size of 可以接受所有这些参数,并且它报告所有值的准确响应。

干杯。

于 2009-10-12T22:51:19.690 回答
-1

sizeof运算符显示我们使用的数据类型的大小。

#include <stdio.h>

int main()
{
    int a;
    float b;
    char c;
    double d;
    printf("%d",sizeof(a));
    printf("%d",sizeof(b));
    printf("%d",sizeof(c));
    printf("%d",sizeof(d));
} 

输出:

a = 4
b = 4
c = 1 
d = 8

如果您使用的是 8 位编译器。

于 2013-06-09T15:55:41.117 回答