我试图以一种我不习惯的方式理解一些使用指针算法的代码。代码中的某一点我遇到了这个:
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]);
我一直在寻找有关这里发生了什么的解释,但我找不到它。此外,有问题的代码显然最终给出了正确的结果(它是蒙特卡罗的一部分)。有什么想法吗?
答案 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
来修复其他代码。