sizeof()如何用于char*(指针变量)?

sizeof()如何用于char*(指针变量)?,c,C,我有一个C代码: char s1[20]; char *s = "fyc"; printf("%d %d\n", sizeof(s1), sizeof(s)); return 0; 它回来了 20 8 我想知道8是怎么来的,谢谢 8是指针的大小,一个地址。在64位机器上,它有8个字节。sizeof(char*)是指针的大小,因此通常32位机器为4,64位机器为8 sizeof另一方面,数组输出数组的大小,在本例中为20*sizeof(char)=20 还有一件事,您应该使用%zu作为size

我有一个C代码:

char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
它回来了

20 8

我想知道8是怎么来的,谢谢

8是指针的大小,一个地址。在64位机器上,它有8个字节。

sizeof(char*)
是指针的大小,因此通常32位机器为4,64位机器为8

sizeof
另一方面,数组输出数组的大小,在本例中为20*sizeof(char)=20

还有一件事,您应该使用
%zu
作为
size\u t
输入
printf
格式

printf("%zu %zu\n", sizeof(s1), sizeof(s));
sizeof(s1)
是内存中数组的大小,在您的例子中,20个字符每1字节等于20

sizeof(s)
是指针的大小。在不同的机器上,它可以是不同的尺寸。我的是4

要在您的计算机上测试不同的类型大小,您只需传递类型而不是像so
printf(“%zu%zu\n”、sizeof(char*)、sizeof(char[20])这样的变量


它将在32位机器上分别打印
4
20

操作员返回
sizeof
类型的大小。
sizeof
的操作数可以是类型或表达式的括号名称,但在任何情况下,大小仅由操作数的类型确定

因此,
sizeof s1
完全等同于
sizeof(char[20])
并返回20

sizeof s
完全等同于
sizeof(char*)
,并返回指向
char
的指针大小(本例中为64位)


如果您想要
s
所指向的C字符串的长度,您可以使用
strlen(s)

如果您在64位计算机上,内存地址是64位的,因此必须使用64位(8字节x 8位/字节)数值来表示数字指针变量(char*)


换句话说,sizeof()对指针的作用方式与对标准变量的作用方式相同。使用指针时只需考虑目标平台。

您在哪个平台上编译?
sizeof
可以很好地用于评估变量的大小:
char c[2];printf(“%uz”,sizeof(c))
是正确的C,返回
2
。但很可能正是您使用的措词让我写下了这条评论。@alk我的意思是,
sizeof
运算符要么应用于表达式,要么应用于类型的括号名称。当它应用于表达式时,编译器使用从该表达式推断出的类型来确定
sizeof
的值。表达式是变量或文本这一事实并不相关,因为它只是所使用的表达式的类型,而不是值。我将重新措辞,使我的观点更清楚。只是有一个疑问,如果我们要找到sizeof(*s),该怎么办?它给了我1个字节,但“fyc”应该是3个字节。请澄清这个疑问。@ChandraShekhar,那是因为
char*s
指向“fyc”的第一个字符。因此,如果您打印f
*s
,则会得到“fyc”的第一个字符,即“f”。单个字符重1字节。这就是为什么你有1个字节。