我正在自学C编程,并坚持这种做法。
int a[] = {5,7,9,11,13};
int *p;
int i = 2;
p = a;
*(p++) = ++i;
printf("%d %d %d %d", a[0], a[i++], *p, *(p+2));
// output: 3 11 7 11我的理解是
1.定义数组a并将其初始化为值5、7、9、11、13
2.定义指针p
3.定义i并用值2初始化它
4.p点指向数组a
5.p1 = 3;
//产出:5 11 5 9
但他们完全错了!
对此我可能需要详细的解释。
请帮帮我,非常感谢!
发布于 2018-10-29 16:07:41
你的理解在3点之前是正确的。
4- p指向a的第一个元素。
5-您正在使用post增量操作符。因此,p的旧值将被使用,p将被递增(意味着p现在将指向a中的第二个元素)。因此,这相当于p[0] = i + 1; p = p + 1; i = i + 1;在此时指向a的第二个元素,a的第一个元素在这里被更改为3。i也是3。
a[0] = 3,a[i++] = a[3] = 11,*p = a[1] = 7,*(p+2) = a[3] = 11。这正是您得到的输出-请参阅这里。
发布于 2018-10-29 16:12:46
对于*(p++) = ++i;行,它将a[0]的值设置为3。注意,由于++在p之后,它在表达式之后计算p=p+1。
a[i++]是a[3],它是11。注意,计数时我们从0开始。
我们在行p中增加*(p++) = ++i;,因此p指向a[1],即3。
最后,*(p+2)意味着p现在指向a[3],它是11。
给你,3 11 7 11
发布于 2018-10-29 16:18:29
这
int a[] = {5,7,9,11,13};
p = a;如下所示
---------------------------------
| 5 | 7 | 9 | 11 | 13 |
---------------------------------
0x100 0x104 0x108 ..(lets assume bas address of a is 0x100)
a
p <-- p pints to base address of a下一个当你喜欢
*(p++) = ++i; /* ++i means 3 */p++在这个表达式中得到相同的(增量后规则)地址,因此3被分配到0x100内存位置,在下一次迭代中p指向0x104内存位置,所以现在数组a如下所示
-----------------------------------------
| 3(5<--old) | 7 | 9 | 11 | 13 |
-----------------------------------------
0x100 0x104 0x108 ..
a |
p <-- p points here接下来,当下面的printf()按以下方式执行时
printf("%d %d %d %d", a[0], a[i++], *p, *(p+2));让我们一个一个地解决
*(p+2) == *(0x104 + 2*4)
== 11 (prints 11)然后*p在7中产生,因为p指向0x104内存位置。
和
a[i++]在a[3] i.e 11中产生,但对于下一个表达式,i变成4。
和
正如我在上面所指出的,a[0]打印3。因此它打印
3 11 7 11.附带注意,函数参数在C中未按定义的顺序计算,请读取这。
https://stackoverflow.com/questions/53049391
复制相似问题