什么';a和a的区别是什么;0作为C指针?

什么';a和a的区别是什么;0作为C指针?,c,arrays,pointers,sizeof,C,Arrays,Pointers,Sizeof,看看C代码 #include <stdio.h> int main(void) { int v[3] = {1, 2, 3}; printf("%d\n", v); printf("%d\n", v + 0); printf("%zu\n", sizeof(v)); printf("%zu\n", sizeof(v + 0)); printf("%zu\n", sizeof(v + 1)); printf("%zu\n", si

看看C代码

#include <stdio.h>
int main(void)
{
    int v[3] = {1, 2, 3};
    printf("%d\n", v);
    printf("%d\n", v + 0);
    printf("%zu\n", sizeof(v));
    printf("%zu\n", sizeof(v + 0));
    printf("%zu\n", sizeof(v + 1));
    printf("%zu\n", sizeof(v + 2));
    return 0;
}
我认为v等于v+0

这两个指针都指向数组v[3]中的第一个元素

因此,v和v+0具有相同的值


但是为什么它们不能保存相同的字节呢?(sizeof(v)和sizeof(v+0)是不同的)

在大多数情况下,数组标识符衰减为指向数组第一个元素的指针。但是,如果数组是
sizeof
运算符的操作数,则不会进行此转换,运算符将以字节为单位生成数组的大小:

除非它是sizeof运算符的操作数、\u Alignof运算符或一元&运算符,或者是用于初始化数组的字符串文字,类型为“类型的数组”的表达式转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,并且不是左值

请注意,在C18标准中,
\u Alignof
运算符已从此段中删除()

因此,
sizeof(v)
产生数组的大小
v[]
,以字节为单位,即12字节。也就是说,操作数的类型是
int[3]
,因为数组没有被转换为指向
int
的指针(在大多数表达式中都是这样),而
sizeof
运算符以字节为单位生成此类型的大小(3
int
s的数组)

但是对于
sizeof(v+0)
表达式
v+0
的类型决定了
sizeof
操作符产生的结果。在表达式
v+0
中,数组
v[]
衰减为指向
v[]
的第一个元素的指针,然后根据指针算术规则添加
0
。结果是指向
int
(因为
&v[0]
本身就是指向
int
)的指针,所以表达式
v+0
的类型是
int*
。因此,在本例中,
sizeof
运算符产生指向
int
的指针大小。类似的表达式
sizeof(v+1)
也是如此

另外,请注意,在首次转换为
void*
后,必须使用
%p
转换说明符打印地址,以避免未定义的行为:

printf("%p\n", (void *)v);
printf("%p\n", (void *)(v + 0));

@谢谢你的链接;刚开始写答案时,我懒得找到它,但现在我已经添加了它;)这是同样的原因\n您不能用
%d
打印地址。必须使用
%p
并将参数强制转换为ptr以使其无效。
printf("%p\n", (void *)v);
printf("%p\n", (void *)(v + 0));