从指针更改数组中的值?

时间:2014-01-07 16:35:01

标签: c++ arrays pointers iostream

我一直在玩指针以帮助我们更好地理解。我已将a声明为长度为3的整数数组和b的整数数组,作为长度为3的整数数组。然后我将a指向b

int main()
{
    int (*a)[3];
    int b[3] { 2, 4, 6 };
    a = &b;
    a[0][0] = 8;
    // This prints out 8 and 8.
    std::cout << a[0][0] << "\t" << b[0];

    // This prints out 0x28fecc and 8.
    std::cout << a[0] << "\t" << b[0];

    return 0;
}

要通过指针b访问a的元素,我必须执行a[0][0],就像a是一个数组数组一样。这与使用new关键字声明指向整数数组的指针进行比较,我只能输出c[0]

int* c = new int[3] { 2, 4, 6 };
std::cout << c[0];

为什么会这样?

非常感谢, 乔治

5 个答案:

答案 0 :(得分:4)

  

我必须做a[0][0],好像a是一个数组数组。

实际上,a是指向数组的指针,因此数组本身为*a,数组的第一个元素为(*a)[0]或等效a[0][0] }。

您可能希望a成为指向数组第一个元素的指针(就像c是指向动态数组的第一个元素的指针一样):

int * a = b;

现在a[i]将是数组的元素i

答案 1 :(得分:1)

a是指向单个数组的指针,所以你真的应该(*a)[0]。当你执行a[0]时,这与*a相同,所以你得到了数组,它在输出中衰减为指针,这就是你看到打印地址的原因。

c是一个指向整数的指针,并且已知指向数组的第一个元素,因此简单的数组符号可以工作。

答案 2 :(得分:1)

a的正常声明将是

int *a;

然后你可以使用

a = b;
std::cout << a[0];

将打印

8

答案 3 :(得分:0)

这是因为你定义了另一种类型。再考虑一下声明

int* c = new int[3] { 2, 4, 6 };

在左侧使用int * c。所以你可以为你的本地数组编写相同的文件

int *a;
int b[3] { 2, 4, 6 };
a = b;

在这种情况下,您只需使用一个下标来访问数组的每个元素:

a[0] = 8;

在此表达式声明中

a = b;

数组b被隐式转换为指向其第一个元素的指针,即右侧的子表达式b具有类型int *

答案 4 :(得分:0)

宣言反映了使用。

b被声明为int b[3];您访问({1}}的第一个元素。

b[0]被声明为a;等效访问权限为int (*a)[3]

如果你打破了#34;等效访问&#34;,你可以看到它有两个操作。首先,它使用解引用运算符&#34;一元星&#34; - (*a)[0]。记住,它本身就是一个指针。取消引用返回指向的值。因此,*a之后,a = &b

那么*a == b的交易是什么?好吧,数组访问运算符a[0][0]实际上适用于通用指针(并且,为了使事情变得更奇怪,数组&#34;衰减&#34;指针)。 []在C中定义为与a[N]完全相同;所以*(a + N)是我们已经讨论过的a[0]。基本上,在此上下文中使用*a而不是a[0][0]使用基于运算符(*a)[0]定义的双关语来隐藏该声明应反映使用。