繁体   English   中英

C 简单数组和指针

[英]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最后的内容是什么?

我发现*pa[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 = &qr[0]*rq相同:

q[1] = *q - y[0][1];

或者

q[1] = q[0] - y[0][1];

qy[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM