main()
{
char a[] = "Visual C++";
char *b = "Visual C++";
printf("\n %d %d",sizeof(a),sizeof(b));
printf("\n %d %d",sizeof(*a),sizeof(*b));
}
sizeof(a)
给我输出:(11
那是字符串的长度)
为什么会这样?
为什么不是输出sizeof(a)
=4
因为当我尝试打印a
时它给了我一个地址值,因此给了我一个整数?
每当您在程序中引用数组的名称时,它通常会衰减为指向数组第一个元素的指针。该规则的一个例外是sizeof
运营商。因此,当您考虑以下代码时。
int main()
{
char a[] = "Visual C++";
printf("sizeof(a)=%d\n",sizeof(a)); /* Here sizeof(a) indicates sizeof array */
printf("a=%p",a); /* Here the array name, passed as an argument to printf decays into a pointer of type (char *) */
return 0;
}
在声明char a[] = "Visual C++"
中,a
是一个 11 的数组char
。所以它的大小是 11 个字节。
在声明char *b = "Visual C++"
中,b
是一个指向char
. 所以它的大小是四个字节(在您使用的 C 实现中)。
在表达式printf("%s", a)
中,a
也是一个数组。但是,它会自动转换为指向数组第一个元素的指针。所以一个指向的指针char
被传递给printf
.
这种转换会自动发生,除非数组是 , 的参数&
,sizeof
或者_Alignof
是用于初始化 的数组的字符串文字char
。因为它是自动发生的,所以人们倾向于将数组名称视为指针。但是,它们不是。
顺便说一句,sizeof
是一个操作符,而不是一个函数。
当 sizeof 应用于静态数组(不是通过 malloc 分配的数组)的名称时,结果是整个数组的大小(以字节为单位)。这是将数组名称转换为指向数组第一个元素的指针的规则的少数例外之一,这可能只是因为实际数组大小在编译时是固定的并且已知,当 sizeof 运算符是评估。
这里有很多错误。
“sizeof(a)
给我输出:(11
字符串的长度)”
字符串的长度是10
,不是11
。sizeof(a)
给你数组的长度。
“为什么会这样,为什么不是输出sizeof(a)
=4
因为当我尝试打印a
时它给了我一个地址值”
这里有两种“打印a
”方法,它们不会“给你一个地址值”:
puts(a);
和:
printf("%s\n", a);
所以你的逻辑是有缺陷的,这就是你困惑的根源。a
当您明确或隐含地选择这样做时,“打印”仅“为您提供地址值”。
sizeof(a)
sizeof
在这种情况下给出 11,因为当数组是操作数时,C 语言定义了运算符来为您提供数组的大小。我认为,这是人们所期望的最自然的行为,所以大概这就是它被定义为这样的原因。
“因此是一个整数。”
在任何情况下,地址都是地址,而不是整数。充其量你可以争辩说它应该给你指针的大小,但肯定不是整数的大小。