1

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

#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;
}
4

3 回答 3

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,而且通常也使用带指针的索引,因为它通常更容易阅读。

于 2013-03-18T01:49:12.077 回答
2

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

简单的:

a[1]++;

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

a[1] = b[1];

如果您想a[1]拥有与该值相同的值,则b[1]不管该值是什么。

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

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

a++ = b++;

1) 完全没有意义 2) 即使ab 指针也不是合法的 C,因为左侧必须是左值,但a++不是 3) 与您希望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]b[1]

于 2013-03-18T02:51:28.180 回答
0

在这种情况下,您的数组实际上并不是指针。当它们作为指针访问时,它们会被编译器转换,但我不相信你可以做类似a++.

如果你想用算术来做到这一点,你需要实际的指针:

int *ap = a, *bp = b;

*ap++ = *bp++;

这就像做a[0] = b[0];然后将每个指针移动到其关联数组中的下一个元素。

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

*++ap = *++bp;

或者你可以只使用数组索引,让你在做什么更明显。

于 2013-03-18T01:49:20.363 回答