了解这个double如何成为一个数组?

时间:2015-09-05 15:31:40

标签: c++ arrays

所以我正在阅读和学习来自互联网的代码(与人工神经网络相关),我发现了一部分代码,我不明白为什么会这样。

double* inputNeurons;
double* hiddenNeurons;
double* outputNeurons;

这是宣布的方式。然后在下一个代码中,它被更改并用作数组?

inputNeurons = new( double[in + 1] );
for ( int i=0; i < in; i++ ) inputNeurons[i] = 0;

inputNeurons[in] = -1; // 'in' is declared in the function as an int

所以,我想了解它为什么以及如何运作。它成了一个“双打”阵列吗?如果是这样,我还能以什么方式使用它?这可以用于struct甚至类吗?

3 个答案:

答案 0 :(得分:5)

每个数组都可以视为指针。但这并不意味着每个指针都是一个数组。不要混淆了!

假设我们有一个数组int test[..],变量名也表示数组存储在内存中的地址。所以你可以写

int * p = test;

此时我的指针p“变成”数组,其中“变为”意味着'指向数组'。你的例子是相似的 - 唯一的区别是内存是动态分配的(堆)而不是堆栈(如我的例子所示)。

那么如何访问元素? 让我们说,我们想得到第一个元素(索引0)。 我们可以说

int i = test[0];

或者我们可以说

int i = *p;

现在我们想要在索引1处获取元素:

int i = test[1];

或者 - 通过使用指针算术,我们可以编写

int i = *(p + 1);

答案 1 :(得分:2)

在C ++(和C)中,指针支持索引操作符[],它基本上按指定的数量调整指针的值乘以指向的类型的大小。

所以基本上

inputNeurons[5] = 0;

相当于

*(inputNeurons+5) = 0

现在这并不能保证inputNeurons指向一个地址,该地址被正确分配以存储至少6个double值,但在语法上它是正确的并且定义良好

您只是将地址调整为指向从指定地址开始的给定类型的第i个元素。

这意味着

double x;
double* px = &x;
px[5] = 0;

虽然它是错误的,但在语法上是正确的,因为px+5是一个指向未正确保留以保存该值的内存的地址。

答案 2 :(得分:0)

类型doubledouble* inputNeurons;)的指针只被指定为指向相同类型的动态分配数组(new( double[in + 1]))的开头。它不会成为一个阵列。

您可以使用任何其他指针和相同类型的常规数组执行此操作。事实上,数组是指向特定地址的指针(指向它的开头,即指向索引为0的元素)。

当你将指针增加+ 1时,那个意味着1 * type_size(即1 * size_of_double

在您的情况下:inputNeurons指向数组的第一个元素的地址。如果您取消引用它:*inputNeurons,您将获得存储在该地址的值(如果inputNeurons是一个数组,它将等同于:inputNeurons[0])。
访问下一个元素只增加一个(*inputNeurons + 1)