2010-05-18 191 views
1

假设我有一个数组a和一个数组b.两者具有相同的类型和大小,但具有不同的值。C++指向不同数组的指针

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

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

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

+8

数组不能在C++中分配。 – 2010-05-18 14:01:07

+0

什么?为什么不?如果他们的尺寸和类型相同,问题在哪里? – begun 2010-05-18 14:02:51

+0

=运算符不能以这种方式工作,它只是将指针指向的地址复制到另一个指针。 – 2010-05-18 14:04:45

回答

1

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

  1. 指针指向哪里?

与以前相同的地方。它们只包含内存的地址,仅此而已。改变“a”不会改变指针。

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

如果创建为

int *a = new int[34]; 

则没有。

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仍指向到所述第一结构体的阵列,但阵列内容将已被覆盖与从第二结构体数组的内容。

+3

尽管有趣的是,您可以分配两个只包含常量大小数组的结构,在这种情况下,它将复制数组的元素从一个到另一个。 – 2010-05-18 14:13:37

+0

C风格的数组是不可分配的,但是'std :: array'是;-) – fredoverflow 2010-05-18 16:07:10

0

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

学习如何使用良好的图形化调试器并逐步完成测试程序将有助于说明发生了什么。我不知道你是否在Windows平台上,但Visual Studio(我认为Visual C++ Express)调试器会向你显示你需要知道的一切,以便你可以运行你自己的实验,看看你的代码在做什么。

0

你不能用a=b覆盖任何东西。实际上,这会泄漏内存,将整个'a'数组留在内存中而没有指向它的内存。 'a'会在a=b之后指向'b'的第一个元素。

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

您的其他指针a [3],a [14] e.t.c.仍然会指向与之前相同的内存。 请注意,[0]与'a'相同。

0

您必须在数组和指针之间做出区别。如果你使用数组,你不能使a=b

如果您使用指针,您可以使a = b,这将意味着一个点,其中B点。它们内部的值不会改变,但不可能访问。一旦你使a = b,当访问一个[3]时,你将访问b [3],因为a [3]的意思是:“其中一个点+3”,以及一个点,其中b点,因此b [3]。

如果你没有空闲的地方分配了a,那么这个信息仍然在内存中,所以如果你制作了3个指针指向哪里指向某个值,那么这个信息仍然可以访问并且不会被修改。

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插入一个
  • 唯一指针地址不会改变值 更改