代码之家  ›  专栏  ›  技术社区  ›  msc

“int*p=+s;”做什么?

  •  62
  • msc  · 技术社区  · 8 年前

    我看到一个奇怪的程序 here .

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

    以上程序测试日期 海湾合作委员会 和 铿锵声 编译程序,在两个编译程序上都可以正常工作。

    我很想知道 int* p=+s; 怎么办?

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

    5 回复  |  直到 7 年前
        1
  •  63
  •   songyuanyao    8 年前

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

    (强调我的)

    内置的一元加号运算符返回其操作数的值。唯一不是no-op的情况是操作数具有整型或非作用域枚举类型(通过整型提升进行更改),例如,它将char转换为int,或者如果操作数受左值限制为rvalue, 数组到指针 ,或函数到指针的转换。

        2
  •  25
  •   John Kugelman Michael Hodel    8 年前

    测试此:

    #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
    
        3
  •  11
  •   taskinoor    8 年前

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

    #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的代码没有影响, 一 和 甲 不完全一样。具体内容请参考胡尔希德·诺穆拉多夫和宋元耀的回答。

        4
  •  10
  •   msc    8 年前

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

    对。

    做什么? int* p=+s; 怎么办?

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

    C++标准,5.3.1元操作符(P7):

    一元+运算符的操作数应具有算术,不带运算 枚举,或 指针类型 结果是 争论。积分提升是在积分或枚举上执行的。 操作数。结果的类型是提升操作数的类型。

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

    有关详细信息,请参见 stack overflow answer .

        5
  •  0
  •   Mudassar    8 年前

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