我对多维数组中的值更改感到有点疯狂,即使分配似乎没有发生。我正在研究一个程序来找到两个字符串之间最长的公共子序列。为此,我创建了一个数组数组,其维数是相应字符串的长度。我将数组的第一行和第一行初始化为零,但由于某种原因,arr[2][0]
变为1
。这在j=0
和k=5
的外部for循环的第一次迭代中发生。
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
int main(int argc, const char * argv[]) {
// insert code here...
string a = "bird";
string b = "turdbi";
int aLen = a.length();
int bLen = b.length();
int arr[aLen][bLen];
//initializing the multidimensional array
for (int i=0;i<aLen;i++){
arr[i][0]=0;
}
for (int i=0;i<bLen;i++){
arr[0][i]=0;
}
int subsequence=0;
for (int j=0;j<aLen;j++){ //(0,0) is the leftmost corner of the table, to compensate for additional row/col
for(int k=0;k<bLen;k++){
if (a.at(j)==b.at(k)){
subsequence = arr[j][k]+1; //add one to upper diagonal
}
else {
subsequence = max(arr[j+1][k],arr[j][k+1]); //find max value from adjacent cells'
}
//how does arr[2][0] ==1??
arr[j+1][k+1]=subsequence;
}
cout << endl;
}
return 0;
}
答案 0 :(得分:2)
评论基本上都说了这一切。当j +的极限值 至于它为什么会发生,保证数组按顺序存储在内存中。因此,当您创建一个数组时 - &gt;在[2] [3]中,你在内存中创建的是这个。 &amp; a [0] [0],&amp; a [0] [1],&amp; a [0] [2],&amp; a [1] [0] ...是指向int的指针。
因此,每次第二个下标递增时(在您的情况下为k),我们将指针值增加sizeof(int)。 &amp; a [0]和&amp; a [1]是指向3个整数的数组的指针。
意思是,每当第一个下标递增时(在你的情况下为j),我们将指针值增加sizeof(int)* 3,因为我们将地址偏移3个整数。 因此,通过执行[0] [4],我们将编辑[1] [1]中的值。在后端,下标运算符只是为您生成偏移量的编译器。0 - a[0][0] -
1 - a[0][1] |--- a[0] == &a[0][0] (same type, same value)
2 - a[0][2] -
3 - a[1][0] -
4 - a[1][1] |--- a[1] == &a[1][0] (same type, same value)
5 - a[1][2] -