[英]C Simple Arrays & Pointers
int a[] = {10, 15, 20, 25};
int b[] = {50, 60, 70, 80, 90};
int *x[] = {a, b};
int *y[] = {a + 2, b + 3};
int *p;
int *q;
int **r;
p = a;
q = y[1];
r = &q;
*p = &p[3] - y[0];
r[0][1] = **r - y[0][1];
a和b最后的内容是什么?
我发现*p
是a[0]
,而&p[3] - y[0]
只是 3 - 2,所以a[0] = 3 - 2 = 1
。 因此, a[] = {1, 10, 15, 20}
(如果我错了请纠正我),但b[]
是我迷路的地方。 我不知道代码的最后一行是如何工作的。 不知道r[0][1]
指的是什么,因此获取 b[] 的内容令人困惑。 PS这是给C的。
该行int **r;
声明一个指向int *
的指针。 换句话说, r
是一个指向 int 指针的指针。 如果您还记得语法x[y]
等价于*(x + y)
,您可能会了解r[0][1]
作用。
r[0][1] --> *((*(r + 0)) + 1)
请记住, r[0][1]
在赋值运算符的 LHS 上,您将存储到该内存位置。
请记住,恒等式*(p + k) == p[k]
(或p + x == &p[k]
)意味着您始终可以将取消引用重写为索引,反之亦然,因此如果表达式令人困惑,您可以尝试不同的形式,看看它是否更有意义。
我个人认为索引更容易推理:
由于r = &q
, r[0]
和*r
与q
相同:
q[1] = *q - y[0][1];
或者
q[1] = q[0] - y[0][1];
q
是y[1]
给出:
y[1][1] = y[1][0] - y[0][1];
y[0]
是a + 2
并且y[1]
是b + 3
:
(b + 3)[1] = (b + 3)[0] - (a + 2)[1];
这是
*(b + 3 + 1) = *(b + 3 + 0) - *(a + 2 + 1);
这是
*(b + 4) = *(b + 3) - *(a + 3);
这是
b[4] = b[3] - a[3];
那是,
b[4] = 80 - 25;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.