"int* p=+s;" 是做什么的?

What does "int* p=+s;" do?

我看到了一种奇怪的程序类型here

int main()
{
    int s[]={3,6,9,12,18};
    int* p=+s;
}

以上程序在 GCCClang 编译器上测试并且在两个编译器上运行良好。

我很想知道,int* p=+s; 是做什么的?

数组s是否退化为指针类型?

那是一元加号,在这里没有实际作用。例如:

#include <iostream>

int main() {
    int a[] = {1};

    std::cout << a << " " << +a << std::endl;
}

这会为 a+a 打印相同的地址。数组像往常一样衰减为指针。

请注意,如果它是一元负 -a 而不是 GCC 将显示错误:

error: wrong type argument to unary minus

编辑:虽然它对 OP 的代码没有影响,但 a+a 并不完全相同。详情请参考Khurshid Normuradov和songyuanyao的回答

内置operator+ could take pointer type as its operand, so passing the array s to it causes array-to-pointer conversion然后返回指针int*。这意味着您可以单独使用 +s 来获取指针。 (对于这种情况,它是多余的;没有 operator+ 它也会衰减到指针,然后分配给 p。)

(强调我的)

The built-in unary plus operator returns the value of its operand. The only situation where it is not a no-op is when the operand has integral type or unscoped enumeration type, which is changed by integral promotion, e.g, it converts char to int or if the operand is subject to lvalue-to-rvalue, array-to-pointer, or function-to-pointer conversion.

这里一元+只是让*p指向整数数组的地址。 让我们取两个数组 s1 和 s2

int s1[]={1,5,2};
int s2[]={2,5,2};

int *p=+s1;
p=+s2; 
printf("%d",(int)p[0]);

输出:2

所以在我看来,一元 + 只是让指针 p 指向数组 s 起始地址。

测试一下:

#include <stdio.h>
int main(){
    char s[] = { 'h', 'e', 'l', 'l', 'o' , ' ', 'w', 'o', 'r', 'l', 'd', '!'} ;
    printf("sizeof(s) : %zu,  sizeof(+s) : %zu\n", sizeof(s), sizeof(+s) ) ;
}

在我的 PC (Ubuntu x86-64) 上打印:

sizeof(s): 12,  sizeof(+s) : 8

哪里

12 = number of elements s times size of char, or size of whole array
 8 = size of pointer

Is array s decayed to pointer type?

是。

What does int* p=+s; do?

一元 + 运算符强制数组衰减为指针。

C++ 标准,5.3.1 一元运算符(P7):

The operand of the unary + operator shall have arithmetic, unscoped enumeration, or pointer type and the result is the value of the argument. Integral promotion is performed on integral or enumeration operands. The type of the result is the type of the promoted operand.

一元 + 形式 (+s) 强制将操作数计算为数字或指针。

有关详细信息,请参阅此 stack overflow answer