我知道在某些情况下,指向指针的指针被描述为矩阵。有人可以解释一下,为什么会这样?其中C
属性允许吗?
请不要发布诸如指向指针的指针并不总是矩阵之类的答案。我知道这一点,但我问为什么在某些情况下它是一个矩阵。
最佳答案
因为操作符[]
内联实现。 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 | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
| | | | | | | |
+---+---+---+---+---+---+---+
我标记了输入字母 E。可以说这是 int M[6][7]
。那么让我们反其道而行之。
&M
- 指向矩阵的指针。如果将其增加或减少 1,您将获得一些其他数据,这很糟糕......因为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 |
+---+
我希望图表有所帮助,因为我不太擅长解释这些东西......
顺便说一句还有一件事,指向指针的指针并不总是矩阵。
关于c++ - 为什么指向指针的指针是一个矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17953681/