![](/img/trans.png)
[英]Why does the sizeof operator in C gives different output in case of NOT operation?
[英]why does sizeof(*pointer) gives output as 1?
#include <stdio.h>
int main()
{
char *str1 = "Abcde";
char str2[] = "Abcde";
printf("sizeof(str1) = %d, sizeof(str2) = %d sizeof(*str1) = %d",
sizeof(str1), sizeof(str2),sizeof(*str1));
return 0;
}
上面的代码给出了sizeof(*str1) =1
的 output 。 有人可以解释为什么我希望它是sizeof("Abcde")
因为它取消引用。
其他答案正确解释了为什么sizeof (*str) == 1
但它们没有解决您可以理解的困惑。
C arrays 在某种意义上是二等公民。 数组对象是实际对象,就像任何其他类型(整数、结构等)的对象一样,但是该语言提供了很少的直接在 arrays 上操作的操作。
相反,数组对象通常是通过指向其元素的指针来操作的。
在您的示例中,您有:
char *str1 = "Abcde";
字符串文字"Abcde"
对应于char[6]
类型的匿名数组 object(5 表示字符串的长度,加上 1 表示终止'\0'
null 字符)。 因此sizeof "Abcde" == 6
。
但是str1
不是指向该数组 object 的指针; 它只是指向其初始元素的指针,该元素包含字符'A'
。 如果我们想要访问数组的其他元素(字符'b'
、 'c'
等),我们需要执行指针运算以将指针推进通过数组 object 的元素。
所以最初, *str1 == 'A'
- 但在++str1
之后, *str1 == 'b'
。
如果要打印字符串的值,可以执行以下操作:
printf("%s\n", str1);
printf
function 将在内部执行遍历字符串字符所需的指针运算。
这就是sizeof (*str) == 1
的原因。 它只指向数组 object 的单个元素。 我们可以使用它来访问其他元素,但指针值本身并不携带任何有关数组大小的信息。 (这就是终止符'\0'
的用途,所以我们可以在事先不知道它有多大的情况下识别字符串的结尾。)
请注意,您可以有一个指向整个数组 object 的指针:
char (*array_ptr)[6] = &"Abcde";
和sizeof *array_ptr == 6
——但这并不像你想象的那么有用。 array_ptr
只能指向一个正好包含 6 个元素的数组,并且由于像printf
和strlen
这样的函数需要char*
指针,因此您不能使用array_ptr
直接操作该数组。 (在处理多维 arrays -- arrays 的 arrays 时,会出现指向数组对象的指针。)
与整个数组对象相比,指向数组元素的指针更加灵活,标准库广泛使用它们。 缺点是您必须自己跟踪数组的大小,例如通过将其作为额外参数传递或使用像'\0'
这样的标记值来标记数组的结尾。
因为*str1
是一个char
。
一个char
是一个字节。
一个字节的大小为一。
sizeof(*str1)
为1
,因为:
str1
是一个char *
*str1
是一个char
根据定义, char
的大小为1
。
一旦将"Abcde"
分配给char *
,您将丢失该原始字符串的所有上下文,包括其大小。
有两个sizeof
的语法 forms :
sizeof (TYPE)
,其中 TYPE 是一个类型(例如int
、 char
等)sizeof expr
,其中expr
是任何表达式(例如1
或*ptr
等) 注意第二种形式中没有()
,在任何情况下,都不会评估TYPE
或expr
(正如标准所说: only for its size
)
注意:还有第三种(隐藏)形式:
sizeof object
; 其中 object 是某个标识符如果是:
char buff[123];
size_t sz = sizeof buff;
, sz
将是123
,因此buff
不会被提升/降级为指针。
注意: sizeof
运算符具有非常强的优先级(检查表格!)所以在
sz = sizeof 1+2;
sz 将等于sizeof(int) + 2
在您的情况下, *str
将是一个字符,值为 'A':它的大小将是一:字符的大小。
就这样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.