2014-03-31 67 views
0

我已经下载了代码,它看起来是正确的(和运行):此代码是如何正确的?

int (*oldMatrix)[NJ] = new int[NI][NJ]; 
int (*newMatrix)[NJ] = new int[NI][NJ]; 

/* initialize elements of old to 0 or 1 */ 
for (i=1; i<=NI; i++) { 
    for (j=1; j<=NJ; j++) { 
     x = rand()/((float)RAND_MAX + 1); 
     if(x<0.5) { 
      oldMatrix[i][j] = 0; 
     } else { 
      oldMatrix[i][j] = 1; 
     } 
    } 
} 

什么我不明白:为什么oldMatrix和大小NI的newMatrix,而不是大小NJ的?

+3

您使用哪种语言? – summea

+1

C++。我认为代码的创建者犯了一个错误,我们不应该只写int ** oldMatrix = new int [NI] [NJ]; int ** newMatrix = new int [NI] [NJ]; ? – user3346223

+0

还有一个严重错误:C++中的数组索引是从零开始的。对于大小为“NI”的数组,访问元素“NI”肯定是一个错误。 (为了比较,只要'NI> = 1',访问'NI-1'就不会有问题。) – rwong

回答

2
int (*oldMatrix)[NJ] = new int[NI][NJ]; 

[NJ]没有宣布它的长度在那里,而是其类型声明的一部分。 oldMatrix是指向长度为NJ的数组的指针,该数组被设置为指向长度为NI数组的动态数组。

这相当于

typedef int row_type[NJ]; 
row_type *oldMatrix = new row_type[NI]; 

编辑:测试

+0

好的,谢谢。我来自C,其中这种表示法表示oldMatrix的大小是NJ,而不是NI ... – user3346223

+1

@ user3346223所讨论的代码比C++更像C。制作矩阵的最好方法是使用'std :: vector'和一个索引函数'I(i,j)= i * NJ + j'。试图强化'[i] [j]'语法会导致太多并发症。 – Cramer

+0

这个符号与C相同,也许你误解了C版本。试试C'int x [NI] [NJ]; int(* p)[NJ] = x; '。如果您将'NJ'更改为'NI',您将收到编译错误。 –

1

由于NI表示没有行和NJ表示没有列。

    NJ 
      a1 a2 a3 a4 
NI  b1 b2 b3 b4 
      c1 c2 c4 c4 
      d1 d2 d3 d4