gpt4 book ai didi

c - 为什么 sizeof(*pointer) 输出为 1?

转载 作者:行者123 更新时间:2023-11-30 20:46:34 24 4
gpt4 key购买 nike

#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的输出。有人可以解释一下为什么我期望它是 sizeof("Abcde") 因为它是解除引用的。

最佳答案

其他答案正确解释了为什么 sizeof (*str) == 1 但它们没有解决您可以理解的困惑。

C 数组在某种意义上是二等公民。数组对象是实际对象,就像任何其他类型(整数、结构体等)的对象一样,但该语言提供的直接操作数组的操作非常少。

相反,数组对象通常通过指向其元素的指针进行操作。

在您的示例中,您有:

char *str1 = "Abcde";

字符串文字 "Abcde" 对应于 char[6] 类型的匿名数组对象(5 表示字符串长度,加上 1 表示终止 >'\0' 空字符)。因此sizeof "Abcde"== 6

但是str1不是指向该数组对象的指针;它只是一个指向其初始元素的指针,该元素包含字符'A'。如果我们想要访问数组的其他元素(字符'b''c'等),我们需要执行指针算术 通过数组对象的元素推进指针。

所以最初,*str1 == 'A' - 但在 ++str1 之后,*str1 == 'b'

如果你想打印字符串的值,你可以这样做:

printf("%s\n", str1);

并且 printf 函数将在内部执行遍历字符串字符所需的指针算术。

这就是为什么sizeof (*str) == 1。它仅指向数组对象的单个元素。我们可以使用它来访问其他元素,但指针值本身不携带有关数组有多大的任何信息。 (这就是终止 '\0' 的用途,因此我们可以识别字符串的结尾,而无需提前知道它有多大。)

请注意,您可以拥有指向整个数组对象的指针:

char (*array_ptr)[6] = &"Abcde";

sizeof *array_ptr == 6 ——但这并不像您想象的那么有用。 array_ptr 只能指向恰好包含 6 个元素的数组,并且因为 printfstrlen 等函数需要 char*指针,您不能使用 array_ptr 直接操作数组。 (当您处理多维数组——数组的数组时,指向数组对象的指针确实会出现。)

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

关于c - 为什么 sizeof(*pointer) 输出为 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58758617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com