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

时间:2018-05-30 06:56:56

标签: c++ arrays pointers unary-operator

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

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

以上程序在 GCC Clang 编译器上进行测试,并在两个编译器上正常运行。

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

数组s是否已衰减为指针类型?

5 个答案:

答案 0 :(得分:62)

内置operator+可以将指针类型作为其操作数,因此将数组s传递给它会导致array-to-pointer conversion,然后返回指针int*。这意味着您可以单独使用+s来获取指针。 (对于这种情况,它是多余的;没有operator+它也会衰减到指针,然后分配给p。)

(强调我的)

  

内置的一元加运算符返回其操作数的值。它不是no-op的唯一情况是当操作数具有整数类型或未整合的枚举类型时,它由整数提升改变,例如,它将char转换为int或者如果操作数受到左值到右值的影响, 数组到指针,或函数到指针的转换。

答案 1 :(得分:24)

测试一下:

#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) ) ;
}

在我的电脑(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

答案 2 :(得分:11)

这是一个一元加号,在这里没有实际效果。例如:

#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的答案。

答案 3 :(得分:10)

  

数组Missing return in a function expected to return 'Int'是否已衰减为指针类型?

  

s做了什么?

一元int* p=+s;运算符强制数组衰减为指针。

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

  

一元+运算符的操作数应具有算术,无范围   枚举,或指针类型,结果是的值   论点。整体推广是针对整体或枚举进行的   操作数。结果的类型是提升的操作数的类型。

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

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

答案 4 :(得分:0)

这里的一元 + 只是让* 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指向数组 起始地址。