为什么不是';t我的数组的大小为4字节(以C为单位)

为什么不是';t我的数组的大小为4字节(以C为单位),c,arrays,sizeof,C,Arrays,Sizeof,调试后,它给了我一个3的结果 为什么结果不是4? foo[3]由4个字符0,1,2,3组成,对吗 char的大小是1字节,那么为什么foo不是4字节呢 为什么结果不是1? 当我调用foo时,它与调用&foo[0]相同。 那么,我如何知道何时调用整个数组以及何时调用第一个字符呢?就像这里的sizeof(foo)我想你会把数组大小和数组索引搞混了。如果声明一个大小为3的数组a,并使用字符a[3]行,它包含三个元素,这些元素被访问为a[0]、a[1]和a[2]。这些是数组中唯一存在的元素a[3]将是不

调试后,它给了我一个3的结果

为什么结果不是4?

foo[3]
由4个字符0,1,2,3组成,对吗

char的大小是1字节,那么为什么foo不是4字节呢

为什么结果不是1?

当我调用
foo
时,它与调用
&foo[0]
相同。
那么,我如何知道何时调用整个数组以及何时调用第一个字符呢?就像这里的
sizeof(foo)

我想你会把数组大小和数组索引搞混了。如果声明一个大小为3的数组
a
,并使用
字符a[3]行,它包含三个元素,这些元素被访问为
a[0]
a[1]
a[2]
。这些是数组中唯一存在的元素<代码>a[3]
将是不允许的

foo[3]
由4个字符0,1,2,3组成,对吗

否。
char
foo
的数组包含三个元素:
foo[0],foo[1],foo[2]
。由于一个字符的大小总是1(不一定是一个字节!),因此一个包含三个字符的数组的大小将是3


至于你们的第二个问题,那个么这个问题可能会有所启发。

好的,我一次只回答一个问题

为什么不是
sizeof(foo)
4的结果?

这是因为在第一条语句
char-foo[3]
中,您只将
foo
数组的大小设置为
3
。如果将绑定显式定义为3
chars
,即3个字节,则没有理由期望结果为
4

为什么结果不是1?


在某些情况下,调用
foo
与调用
&foo[0]
是一样的,这是正确的。这些情况中与您的问题最相关的是作为指针作为参数传递给函数的情况。对于
sizeof
函数,当您传入
foo
数组指针时,函数迭代器将遍历与该指针关联的内存块,并返回总大小,因此不是
1

三个字符:
foo[0],foo[1],foo[2]
。你要求3分,你错了
foo
由3个字符组成。在
foo[3]
中,您究竟从哪里获得了
0、1、2、3
?如果您从字符串文字初始化字符数组,则只能获得一个“额外”字符(并且仅当您为其留出空间或根本不指定数组大小时)。您正在使用它做什么,这需要您知道它是数组还是第一个字符?如果它是一个数组,您将如何处理它。如果是第一个角色会有什么不同吗?这不是唯一的主要情况。算术表达式也浮现在脑海中。事实上,数组衰减到指针的频率更高。挑剔的大小不是一个函数,它是一个运算符,并且不进行迭代。@StoryTeller是的,你说得对。我只提到函数参数示例,因为它与他的问题相关
char foo[3] = { 97, 98, 97 };
printf("%d",sizeof(foo));