c - 指针和数组练习题
问题描述
我正在自学 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.p[1] = 3;
- a[0] = 5, a[3] = 11, *p = p[0] = 5, *(p+2) = p[2] = 9
//输出:5 11 5 9
但他们完全错了!
我可能需要对此进行详细解释。
请帮助我,非常感谢!
解决方案
你的理解是正确的,直到 3 点。
4 -p
指向 的第一个元素a
。
5 - 您正在使用后增量运算符。Sop
的旧值将被使用并p
递增(意味着p
现在将指向 中的第二个元素a
)。所以这相当于p[0] = i + 1; p = p + 1; i = i + 1;
此时p
是指向第二个元素,a
而第一个元素a
变成了3
。i
也是3
在这一点上。
a[0] = 3
,a[i++] = a[3] = 11
,*p = a[1] = 7
,*(p+2) = a[3] = 11
.
这正是您得到的输出 - 请参见此处。
推荐阅读
- appveyor - 为 post_build 操作查找 AppVeyor 构建工件的位置
- excel - 如何防止活动单元格的值发生变化
- docker - Openshift 在启动期间无法连接到 localhost
- wordpress - 我需要替换服务器上的 index.php
- javascript - 通过事件委托在动态生成的元素上切换 CSS 类时遇到问题
- gradle - Gradle 创建一个空文件夹`build/kotlin/sessions`,为什么?当我删除它时它又回来了,如何修复它?
- android - 如何为 Android auto 构建自定义应用程序?
- javascript - 使用 Jquery 如何获取输入值来确定 Data Min Max Range 上的选择框值
- awk - 使用 awk 更改两个不同行中的值
- outlook - Office 365 组日历中的自定义加载项