C ++ - 指针和数组

时间:2011-12-15 20:24:38

标签: c++ arrays pointers

我是c ++的新手,我对指针和数组有疑问

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char * argv[]) 
{
    int a[5] = {1,7,-1,0,2};
    int b[5] = {7,5,3,4,2};
    int c[5] = {1,4,5,3,1};

    *(&a[2] + (&c[5] - 7 - &c[0]))= a[1];
    *(&a[3] + (&c[5] - 7 - &c[0]))= b[1];
    *(&a[4] + (&c[5] - 7 - &c[0]))= c[1];
    int x = a[0] - a[1] + a[2] - a[3];


    printf ("%d", x);
    return 0;
}

为什么x = 6? THX

3 个答案:

答案 0 :(得分:5)

答案是你的操作在逻辑上暗示它/你正在某处调用未定义的行为。

true 的答案是没有人写这样的代码

  • 如果你在面试中发现这一点,请打电话给他们虚张声势并大笑。如果他们认真对待,请离开。
  • 如果您在实际代码中找到它,请将其发布在thedailywtf中。然后拒绝碰它。

答案 1 :(得分:2)

从开始:

*(&a[2] + (&c[5] - 7 - &c[0]))= a[1];

首先我们注意到子表达式(&c[5] - 7 - &c[0])被多次使用 (&c[5] - 7 - &c[0])可以重新排列为(&c[5]- &c[0] - 7 ),这是c的第五个int的地址,减去c的第0个int的地址,结果为{{1} }},所以表达式为5(5-7) -2是第二个索引的地址减去2,与(&a[2] -2)相同。因此&a[0]*(&a[2] + (&c[5] - 7 - &c[0])) 通过推断,其余代码如下:

a[0]

然后我们进入最后的等式:

              //a is {1,7,-1,0,2};
a[0] = a[1];  //a is {7,7,-1,0,2};
a[1] = b[1];  //a is {7,5,-1,0,2};
a[2] = c[1];  //a is {7,5, 4,0,2};

当我们在数组的那些位置找到值时:

int x = a[0] - a[1] + a[2] - a[3];

结果为int x = 7 - 5 + 4 - 0;

*地址实际上相隔5个(它们通常是20或40),但是当你减去6个指针时,它会产生{{ {1}}介于它们之间,即五个。

答案 2 :(得分:2)

间接运算符&amp;用于表示变量的地址

运营商*可用于指代目标

运营商&amp;

int c : variable integer
&c : memory address of the variable

运营商*

int *c : pointer to an integer variable
*c: content pointed to by c

结果6是以下产品:

(&c[5] - 7 - &c[0])  is always equal to -2, 

*(&a[2] + (&c[5] - 7 - &c[0]))= a[1];  // a[0]=a[1]  
*(&a[3] + (&c[5] - 7 - &c[0]))= b[1];  // a[1]=b[1]  
*(&a[4] + (&c[5] - 7 - &c[0]))= c[1];  // a[2]=c[1] 

结果

a[0]=7, a[1]=5, a[2]=4 and a[3]=0
6 = 7 - 5 + 4 -0