因为操作符[]内联实现.a[b]实际上是*(a + b)
所以第一个[]选择行,第二个选择列.因此,它是arr[m][n]一样stepOne = *(arr + M),其中M = m * n和stepTwo = stepOne[n],
这是一样的*(stepOne + n).所以在这个链之后,我们看到arr[m][n]了相同的东西*(arr m*n + n)
要确认什么是真的,您可以查看这个简短的程序
int main()
{
char arr[10][15];
std::cout << sizeof(arr) << std::endl; //150
std::cout << sizeof(*arr) << std::endl; //15
std::cout << sizeof(arr[0]) << std::endl; //15
std::cout << sizeof(*arr[0]) << std::endl; //1
std::cout << sizeof(**arr) << std::endl; //1
std::cout << sizeof(arr[0][0]) << std::endl; //1
std::cout << arr << std::endl; //some number
std::cout << arr+1 << std::endl; //some number + 15
std::cout << &arr << std::endl; //some number
std::cout << &arr+1 << std::endl; //some number + 150
return 0;
}
+---+---+---+---+---+---+---+
This is matrix: | E | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)
我标记了输入字母E.让我们说这是int M[6][7].所以让我们走相反的道路.
&M - 指向矩阵的指针.如果你增加或减少一个你会得到一些其他数据,这是不好的...因为sizeof(M)是相同的sizeof(int) * 7 * 6&M[0]指向矩阵第一行的指针.如果你增加它,你将进入下一行,因为sizeof(M[0])它等于sizeof(int) * 7.&(M[0][0])并且sizeof(M[0][0])等于sizeof(int).所以要制作一个图表:
+---+---+---+---+---+---+---+
M[0] ----> | E | | | | | | |
+---+---+---+---+---+---+---+
+---+
M[0][0] ----> | E |
+---+
Run Code Online (Sandbox Code Playgroud)
我希望图形帮助,因为我不太擅长解释这些东西......
BTW还有 一件事,指针指针并不总是一个矩阵.