C++ 了解此双精度阵列是如何形成的吗?

C++ 了解此双精度阵列是如何形成的吗?,c++,arrays,C++,Arrays,因此,我目前正在阅读和学习一个来自互联网的代码(与人工神经网络相关),我发现了一部分代码,我不明白它为什么会起作用 double* inputNeurons; double* hiddenNeurons; double* outputNeurons; 这就是它被宣布的方式。然后在接下来的代码中,它被更改并用作数组 inputNeurons = new( double[in + 1] ); for ( int i=0; i < in; i++ ) inputNeurons[i] = 0;

因此,我目前正在阅读和学习一个来自互联网的代码(与人工神经网络相关),我发现了一部分代码,我不明白它为什么会起作用

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
inputNeurons=new(双[in+1]);
对于(inti=0;i
所以,我想了解它的工作原理和原因。它是否变成了一系列的“双打”?如果是的话,我还可以用什么方式使用它?在C++(和C)指针中,这可以用于结构或类吗?

< p>支持索引操作符<代码> []/Cord>,它基本上调整指针的值,所指定的大小是指定的类型的大小。

所以基本上

inputNeurons[5] = 0;
相当于

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

您只是在调整一个地址,以指向从指定地址开始的给定类型的第i个元素

这意味着

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

语法上是正确的,尽管它是错误的,因为
px+5
是一个指向内存的地址,内存没有被正确保留以保存该值。

每个数组都可以被视为指针。但这并不意味着每个指针都是一个数组。别把这个弄混了

假设我们有一个数组
int test[…]
,那么变量名也表示数组存储在内存中的地址。这样你就可以写作了

int * p = test;
int i = *(p + 1);
此时,我的指针
p
“变成”数组,其中“变成”表示“指向数组”。您的示例与此类似-唯一的区别是内存是动态分配的(堆),而不是在堆栈上分配的(如我的示例所示)

那么如何访问这些元素呢? 比方说,我们想要得到第一个元素(索引0)。 我们可以说

int i = test[0];
int i = *p;
或者我们可以说

int i = test[0];
int i = *p;
现在我们想得到索引1处的元素:

int i = test[1];
或者-通过使用指针算法,我们可以编写

int * p = test;
int i = *(p + 1);

类型为
double
double*inputNeurons;
)的指针被分配到指向同一类型的动态分配数组(
new(double[in+1]
)的开头。它不会变成数组

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

当指针增加+1时,表示
1*type\u size
(即
1*size\u/u double


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

代码中似乎有一个bug。但在语法上,指针可以像数组一样被索引。如果它们指向数组中的一个元素,这会非常方便。代码可以工作,因为我编译了它并测试了它的功能。看,是的,你是对的。我误读了
inputNeurons=new(double[in+1])中括号的位置我希望分配的内存稍后在代码中被销毁(删除[])。我想说,您的示例相当于
inputNeurons+5
,如果没有该部分的大小,它也可以用于结构和类吗?像我的结构*神经元;神经元=新的(myStruct[5]);并且有5个myStruct可以通过[0]…[4]访问?是的,正确的语法是
myStruct*neurons=newmystruct[5]但是注意你在C++中工作,所以<代码>向量可能是更好的解决方案。不要忘记使用
new
时需要
delete
,如果要分配数组,则必须使用
delete[/code>,因为编译器无法确定所指向的数据确实是数组,而不仅仅是单个值。@Jeremy是的,它适用于所有默认的可构造类型。但是括号使它看起来很混乱。通常的语法是
T*a=newt[N]向量?我将尝试查找它,感谢您的建议,在您的示例中内存不是静态分配的。它是自动分配的。它是在堆栈上创建的。但是,是的,静态可能是一个糟糕的描述。