繁体   English   中英

为什么 sizeof(*pointer) 将 output 设为 1?

[英]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 个元素的数组,并且由于像printfstrlen这样的函数需要char*指针,因此您不能使用array_ptr直接操作该数组。 (在处理多维 arrays -- arrays 的 arrays 时,会出现指向数组对象的指针。)

与整个数组对象相比,指向数组元素的指针更加灵活,标准库广泛使用它们。 缺点是您必须自己跟踪数组的大小,例如通过将其作为额外参数传递或使用像'\0'这样的标记值来标记数组的结尾。

因为*str1是一个char

一个char是一个字节。

一个字节的大小为一。

sizeof(*str1)1 ,因为:

  1. str1是一个char *

  2. *str1是一个char

  3. 根据定义, char的大小为1

一旦将"Abcde"分配给char * ,您将丢失该原始字符串的所有上下文,包括其大小。

有两个sizeof的语法 forms :

  • sizeof (TYPE) ,其中 TYPE 是一个类型(例如intchar等)
  • sizeof expr ,其中expr是任何表达式(例如1*ptr等)

注意第二种形式中没有() ,在任何情况下,都不会评估TYPEexpr (正如标准所说: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM