若new生成数组的时候,无论每一行的行数组大小是否相同,其一维指针与实际元素存放的地址完全不同。
#include<iostream>
using namespace std;
int main(void) {
int** dp = new int* [5 + 1];
for (int i = 0; i <= 5; i++) {
dp[i] = new int[i];
//初始化dp矩阵。
}
for (int i = 0; i <= 5; i++) {
cout << "dp[" << i << "]:" << &dp[i] << endl;
for (int j = 0; j <= i; j++) {
cout << "dp[" << i << "]" << "[" << j << "]:";
cout << &dp[i][j] << endl;
}
}
}
则地址的现象如下图所示:
可以发现一维指针(dp[0],dp[1]…)的值被单独存储在内存中的某一个空间内。
实际的元素(dp[0][0],dp[0][1]…)的值存放在了内存中另一个空间内。
每一行元素个数相同的现象:
#include<iostream>
using namespace std;
int main(void) {
int** dp = new int* [5 + 1];
for (int i = 0; i <= 5; i++) {
dp[i] = new int[5 + 1];
//初始化dp矩阵。
}
for (int i = 0; i <= 5; i++) {
cout << "dp[" << i << "]:" << &dp[i] << endl;
for (int j = 0; j <= 5; j++) {
cout << "dp[" << i << "]" << "[" << j << "]:";
cout << &dp[i][j] << endl;
}
}
}
dp[0]和dp[0][0]的位置完全不相同,可见一斑。
而若直接不使用new,而是直接使用int dp[6][6]这种形式,则二维数组十分整齐。
#include<iostream>
using namespace std;
int main(void) {
int dp[6][6] = { 0 };
for (int i = 0; i <= 5; i++) {
cout << "dp[" << i << "]:" << &dp[i] << endl;
for (int j = 0; j <= 5; j++) {
cout << "dp[" << i << "]" << "[" << j << "]:";
cout << &dp[i][j] << endl;
}
}
}
dp[0]等于dp[0][0],与[]运算符的规则:dp[x] = *(dp + x)符合。