有人可以解释一下这段代码中发生了什么吗?(数组)
Can someone explain what is going on in this code? (arrays)
我试图理解这个,但没有机会。它是如何工作的?
#include <stdio.h>
int tavuk(int i)
{
return (i%3 != 0 ? i + tavuk(--i) : i);
}
void main(void)
{
int *p, array_a[]={5,2,4,7,3};
p = array_a;
printf("%d", tavuk(array_a[*(++p)]));
}
您应该将
调试器附加到程序,放置一些断点并一次单步执行一行,以便您可以观看代码发挥其魔力。也许在难以辨认的表达式周围添加额外的括号和空格也会对您有所帮助。
我写了一个分步解释下面发生的事情(阅读风险
自负(:p
指向p = array_a;
之后array_a[]
的第一个元素然后执行
++p
,p
指向array_a
中的第二个元素(其地址返回到取消引用运算符*
(*
返回数组中第二个字段的值 (2((因为++p
返回了array_a[1]
的地址(现在检索
array_a[2]
并将其值 (4( 传递到tavuk(...)
内部
tavuk(...)
(4%3 != 0)
计算结果为 true--i
已执行(现在i = 3
(tavuk(...)
用 3 调用,在它里面(3%3 != 0)
计算为 false,返回 3递减的
i
(3( 将添加到第二个tavuk(...)
调用的返回值(也是 3(中,返回 66 打印到 stdout
最初 p 指向数组array_p的开头。语句 array_a[*(++p(] 可以分解如下:
- ++p ==> 增量指向下一个内存地址,在本例中地址为 array_p[1]
- *(++p( ==> 此地址处的整数值,在本例中为 2 或 array_p[1]
因此,将整数值 2 传递给 tavuk 方法。从该方法返回后,您将获得值 5。
相关文章:
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 代码使用向量成功运行,但使用数组显示错误
- C++逗号分隔的输入数组代码过早退出
- 如何修改代码以打印出数组 v2
- 我正在尝试解决一个需要数组总和值但代码不起作用的问题,我想做这样的事情
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- 使用基于数组和范围的 For 循环替换一些基本代码行
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 为什么我的代码在尝试复制字符数组时引发 C6386 错误?
- 我的旋转数组代码给出了大数组大小的错误
- 如何修复将传输到 java 的 2d 数组代码使用 JNI
- [C++]重新定义 y 值的基本数组代码。它正在工作,但无法解释为什么
- 为什么我的数组代码的反向不能正常工作
- C++ 数组代码错误
- 这个字符数组代码有什么问题?
- 我的数组代码有什么问题
- 为什么相同的数组代码的执行时间之间存在差异