C中的数组赋值使用指针算法

时间:2013-03-18 01:43:50

标签: c arrays pointers pointer-arithmetic

当我使用指针算法访问特定元素时,如何更改数组中的值?

#include <stdio.h>

int main() {
  int a[3] = {1, 1, 1}, b[3] = {2, 2, 2};

  a++ = b++; // How can I get this to work so a[1] = b[1]?

  return 0;
}

3 个答案:

答案 0 :(得分:7)

数组不是指针。重复三次; 数组不是指针

您不能递增数组,它不是可赋值(即,您不能改变它)。您当然可以将其编入索引以获取值:

a[1] = b[1];

其次,当您要分配给数组的元素时,您当前的代码正在尝试递增,然后为数组本身分配新值。在需要时,数组会降级为指针,所以这也适用:

int *a_ptr = a;
int *b_ptr = b;
*++a_ptr = *++b_ptr;
// or, better...
a_ptr[1] = b_ptr[1];

你打算做什么。我更喜欢版本1,并且通常也会使用带指针的索引,因为它通常更容易阅读。

答案 1 :(得分:2)

  

我怎样才能让它工作,所以[1] = b [1]?

简单:

a[1]++;

如果您只想将a[1](1)增加为b[1]恰好是(2),或

a[1] = b[1];

如果您希望a[1]b[1]具有相同的值,无论该值是什么。

  

当我使用指针算法访问特定元素时?

在您的示例中,您没有访问任何元素,也没有进行指针运算,因为ab是数组,而不是指针。你的问题的表述很难解释,因为这是因为

a++ = b++;

1)完全没有意义2)即使ab 指针,也不会是合法的C,因为左边必须是左值,但是{{ 1}}不是3)与您希望a++a[1]相同的愿望无法辨别。可能你想要的是:

b[1]

这确实会将int* ap = a; // get pointer to first element of a int* bp = b; // get pointer to first element of b // point ap to second element of a and // point bp to second element of b and // copy the value at *bp to *ap *++ap = *++bp; 设置为a[1]

答案 2 :(得分:0)

在这种情况下,您的数组实际上不是指针。当它们作为指针访问时,编译器会对它们进行转换,但我不相信您可以执行a++之类的操作。

如果你想用算术做这个,你需要实际的指针:

int *ap = a, *bp = b;

*ap++ = *bp++;

这就像在执行a[0] = b[0];,然后将每个指针移动到相关数组中的下一个元素。

但是你的问题是你要设置a[1] = b[1]。好吧,你可以这样做:

*++ap = *++bp;

或者你可以使用数组索引,让你更清楚你正在做什么。