我知道在某些情况下,指向指针的指针被描述为矩阵。有人可以解释一下,为什么这种方式有效?哪个C
属性允许它?
请不要将指针发布到指针并不总是矩阵这样的答案。我知道,但是我想问为什么它在某些情况下是矩阵。
答案 0 :(得分:7)
由于操作符[]
内联实现。 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
- 指向矩阵的指针。如果你增加或减少一个,你会得到一些其他数据,这很糟糕......因为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 |
+---+
我希望图表有所帮助,因为我在解释这些内容方面不太好......
BTW 还有一件事,指向指针的指针并不总是一个矩阵。
答案 1 :(得分:0)
为什么指针指针是一个矩阵?
每种情况都不是这样。
指针也可以是指向单个元素的指针,因此“指针指针”也可以是指向单个指针的指针。
指向指针的指针是有效(密集)“矩阵”,如果
(如果这是关于C ++:不要使用指针到指针语法,而是坚持使用类似this的1d表示。)