for循环使用数组指针,将值设置为指针

时间:2015-05-03 18:53:00

标签: c arrays pointers

我对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本身是地址吗?如何递减/递增指针以转到下一个地址?

提前致谢

1 个答案:

答案 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;

试一试!!