for循环中的指针算法

时间:2012-10-26 16:21:25

标签: c++ for-loop pointer-arithmetic

我试图以一种我不习惯的方式理解一些使用指针算法的代码。代码中的某一点我遇到了这个:

complex<double> **P, *p_row, result=complex<double>(0,0);
P=new complex<double>*[n];
for(i=0;i<n;i++) P[i]=new complex<double>[n];

for(i=0,p_row=*P;i<n;i++,p_row+=n) result+=log(*(p_row+i));

如果P是一个矩阵,这对我来说就像添加P的对角元素的对数一样。但事实证明上面的最后一行是而不是相当于

for(i=0;i<n;i++) result+=log(P[i][i]);

我一直在寻找有关这里发生了什么的解释,但我找不到它。此外,有问题的代码显然最终给出了正确的结果(它是蒙特卡罗的一部分)。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您发布的代码错误;它会调用未定义的行为。

EG。在第二次迭代中,p_row(*P)+n*P指向大小为n的数组,因此,当代码读取*(p_row+i)时,它会读取数组的末尾。

最后一行似乎假设矩阵存储在单个连续数组中(例如,行主要)。但是,这意味着P将由complex<double>*初始化为P = new complex<double>[n*n];

答案 1 :(得分:2)

具有p_row+=n的循环表现出未定义的行为,因为它假定循环在第三行上完成的分配是连续的,但在几乎所有实现中它们都不是。

P[i][i]的代码检索到正确的结果。您可以通过一次性分配n*n元素,然后在循环中将它们分成p来修复其他代码。