繁体   English   中英

作为C指针的a和+ 0之间有什么区别?

[英]What's the difference between a and a + 0 as C pointers?

看看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;
}

这是其中一个输出:

-587904464
-587904464
12
8
8
8

我认为v与v + 0相同。

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

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

但为什么他们不能保持相同的字节? (sizeof(v)和sizeof(v + 0)不同)

大多数情况下,数组标识符衰减到指向数组第一个元素的指针。 但是,当数组是sizeof运算符的操作数时,不会发生此转换,并且运算符会以字节为单位生成数组的大小。 根据C11标准草案的§6.3.2.1¶3

除非它是sizeof运算符, _Alignof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,否则将具有类型''数组类型''的表达式转换为表达式输入''指向类型'的指针,指向数组对象的初始元素,而不是左值。

请注意,在C18标准中, _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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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