我知道在某些情况下,指向指针的指针被描述为矩阵。有人可以解释一下,为什么会这样?哪个C
属性允许它?
请不要发布诸如指向指针并不总是矩阵之类的答案。我知道,但我在问为什么在某些情况下它是一个矩阵。
因为运营商[]
内联实现。a[b]
实际上是*(a + b)
所以第一个[]
选择行,第二个选择列。所以它与where和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
- 指向矩阵的指针。如果您将其增加或减少一个,您将获得一些其他数据,这很糟糕......因为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++:根本不要使用指针到指针的语法,而是坚持使用类似这样的一维表示。)