C ++指向不同数组的指针

时间:2010-05-18 13:58:54

标签: c++ arrays pointers

假设我有一个数组a和一个数组b.两者都有相同的类型和大小但值不同。

现在我创建3个左右指针指向a中的不同元素,你可以说a[0]a[4]a[13]

现在,如果我通过ab覆盖a=b - 指针指向哪里?

指针是否仍指向a中的原始位置,但它们指向的值现在是b的值?

6 个答案:

答案 0 :(得分:13)

在C ++中无法分配数组。声明数组后:

int a[10];

没有办法覆盖它,只能改变它包含的值。具体来说,你做不到:

int a[10], b[10];
a = b;    // cannot work in C++ (or C)

如果动态创建数组并指定指针:

int * a = new int[10];
int * p = a + 1;
int * b = new int[10];
a = b;

然后指针p仍然指向第一个数组,但是你有内存泄漏。

对于包含数组的结构:

struct S {
    int a[10];
};

S s1, s2;
int * p = s1.a + 1;
s1 = s2;

然后指针p仍然指向第一个结构的数组,但是数组内容将被第二个结构中的数组内容覆盖。

答案 1 :(得分:1)

这是一个有趣的问题。所以让我们分解一下:

  1. 指针指向哪里?
  2. 和以前一样的地方。它们只包含内存的地址,仅此而已。改变“a”不会改变指针。

    1. 指针指向a中的原始位置但是它们指向的值现在是b的那些?
    2. 如果a创建为

      int *a = new int[34];
      

      然后没有。

答案 2 :(得分:0)

如果不直接更改存储指针的变量,则不会改变它们指向的位置。更改存储在“指向”位置的值将更改指针的取消引用值,但它们仍指向相同的位置。

学习如何使用优秀的图形化调试器并逐步完成测试程序将有助于说明正在发生的事情。我不知道你是否在windows平台上,但是visual studio(我认为Visual C ++ Express)调试器会向你展示你需要知道的一切,这样你就可以运行自己的实验,看看你的代码到底在做什么

答案 3 :(得分:0)

您无法使用a=b覆盖任何内容。实际上,这会泄漏内存,将整个“a”数组留在内存中,而不指向它。 'a'将指向a=b之后'b'的第一个元素。

int * a = new a[5];之类的声明之后,你的'a'指向数组的第一个元素。您可以像++一样进行指针运算,然后将转到数组中的第二个元素,使第一个元素没有指向它的指针。同样的方式a = b将它指向b数组的第一个元素。

你的其他指针a [3],[14] e.t.c.仍将指向与以前相同的记忆。 请注意,[0]与'a'相同。

答案 4 :(得分:0)

你必须在数组和指针之间做出改变。如果使用数组,则无法生成a=b

如果使用指针,则可以设为a = b,这意味着b指向的点。它们内部的值不会改变,但是无法访问。一旦你得到a = b,当访问[3]时你将访问b [3],因为a [3]意味着:“其中一个点+3”,以及一个b指向的点,因此b [3]。< / p>

如果你没有在分配a的地方空闲,那么该信息仍然在内存中,所以如果你指出3个指针指向曾经指向+某个值的位置,那么该信息仍然可以访问而不是修改

答案 5 :(得分:0)

a = b不起作用,但您可以将数组b复制到使用STL中。 举个例子:

int a[15] = {0};
int b[15] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};

int *p1 = a; // pointer to a[0]
int *p2 = a+4; // pointer to a[4]
int *p3 = a+13; // pointer to a[13]

std::copy(&b[0], &b[15], a);

如果您有指向数组的指针,那么在复制之前声明的元素为:

    如果您将b复制到,
  • 指针的地址不会改变
  • 只有指针的值 改变