我对C完全陌生,必须使用现在有点令人困惑的指针。
我的任务是重写代码:
const int length = 3;
int a[3] = { 2, 1, 3 };
int* p = a;
for (int i = length - 1; i > 0; i--)
a[i - 1] += a[i];
所以它没有使用' []'不再使用指针而是使用指针。
我的第一次尝试:
const int length = 3;
int a[3] = { 2, 1, 3 };
int* p = a;
for (int i = length - 1; i > 0; i--) {
*(p - 1) += *p;
p--;
}
所以我知道这个没有用,但我不知道如何正确使用指针。你什么时候使用*
而不是?它究竟意味着什么? *
是指针后面的值,p本身是地址吗?如何递减/递增指针以转到下一个地址?
提前致谢
答案 0 :(得分:2)
指针# New-style buffer API, for Python 2.7 and 3.x.
# PyObject_CheckBuffer uses the new-style API.
# 2.6 also has the new-style API, but no memoryview,
# so you can't use it or check compatibility from Python code.
try:
memoryview(thing)
except TypeError:
# Doesn't support it!
# Old-style API. Doesn't exist in 3.x.
# Not quite equivalent to PyObject_CheckBuffer.
try:
buffer(thing)
except TypeError:
# Doesn't support it!
已经指向数组的第一个元素,在递减操作(p
)之后,--p
开始指向未分配的位置(在数组外) - 原因未定义的行为。
首先,您需要了解,如果p
是指向数组第一个元素的指针,则数组表达式a[i]
等效于*(a + i)
,它也等同于*(p + i)
。此外,p
也可以写为a[i - 1]
,并且等同于表达式*(a + i - 1)
。
声明*(p + i - 1)
:
p
数组名称衰减到数组中第一个元素的地址(与int* p = a;
相同)。
现在,以下是反向循环 - 从数组中的最后一个位置向后迭代。
&a[0]
它也可以写成:
for (int i = length - 1; i > 0; i--)
a[i - 1] += a[i];
因此可以写成
for (int i = length - 1; i > 0; i--)
*(a + i - 1) += *(a + i);
这只是代码的简单翻译,以for (int i = length - 1; i > 0; i--)
*(p + i - 1) += *(p + i);
指向第一个元素的形式。
让我们采用一种新的方法,并了解循环的实际作用:
p
操作for (int i = length - 1; i > 0; i--)
a[i - 1] += a[i];
与a[i - 1] += a[i];
相同。这意味着 - 在循环中,在每次迭代中,a[i - 1] = a[i - 1] + a[i];
位置的值被添加到i
,其中i - 1
的值为i
。参见:
2 >= i > 1
所以,如果数组的初始值是:for (int i = 3 - 1; i > 0; i--)
// ^^ == 2
a[i - 1] = a[i - 1] + a[i];
,那么每次迭代都是:
a[3] = { 2, 1, 3 };
在上面的循环中,您将向后迭代并将当前 // 0 1 2
{ 2, 1, 3 };
i = 2
a[2 - 1] = a[2 - 1] + a[2];
a[1] = a[1] + a[2]
{ 2, 4, 3 };
i = 1
a[1 - 1] = a[1 - 1] + a[1];
a[0] = a[0] + a[1]
{ 6, 4, 3 };
索引值添加到上一个索引。请注意,因为在每次迭代中,您都可以访问i
处的一个元素,因此循环必须在i - 1
处中断,或者我们可以在i == 1
处说明。
让我们以您想要的方式重写正确的代码:
i > 0
现在,这仍然是非常详细的代码,我们可以按如下方式对其进行改进:
const int length = 3;
int a[3] = { 2, 1, 3 };
int* p = a + length - 1; // now `p` points to `&a[2]`
for (int i = length - 1; i > 0; i--)
*(p - 1) += *p;
--p;
int a[3] = { 2, 1, 3 };
for (int* p = &a[2]; p != a; --p)
*(p - 1) += *p;
试一试!!