所以我正在阅读和学习来自互联网的代码(与人工神经网络相关),我发现了一部分代码,我不明白为什么会这样。
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甚至类吗?
答案 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)
类型double
(double* inputNeurons;
)的指针只被指定为指向相同类型的动态分配数组(new( double[in + 1]
))的开头。它不会成为一个阵列。
您可以使用任何其他指针和相同类型的常规数组执行此操作。事实上,数组是指向特定地址的指针(指向它的开头,即指向索引为0的元素)。
当你将指针增加+ 1时,那个意味着1 * type_size
(即1 * size_of_double
)
在您的情况下:inputNeurons
指向数组的第一个元素的地址。如果您取消引用它:*inputNeurons
,您将获得存储在该地址的值(如果inputNeurons
是一个数组,它将等同于:inputNeurons[0]
)。
访问下一个元素只增加一个(*inputNeurons + 1)
。