我是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
答案 0 :(得分:5)
答案是你的操作在逻辑上暗示它/你正在某处调用未定义的行为。
但 true 的答案是没有人写这样的代码。
答案 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