为什么指针指针是一个矩阵?
我知道在某些情况下,指向指针的指针被描述为矩阵。 有人可以解释一下,为什么这种方式有效? 哪个C
属性允许它?
请不要发布指针这样的答案指针并不总是矩阵。 我知道,但我想问为什么它在某些情况下是一个矩阵。
因为opeator []
内联实现。 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
相同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还有一件事,指针指针并不总是一个矩阵。
为什么指针指针是一个矩阵?
对于每种情况都不是这样。
指针也可以是指向单个元素的指针,因此“指针指针”也可以是指向指向单个元素的单个指针的指针。
指向指针的指针是有效(密集)“矩阵”,如果
- 这是一个指针数组,
- 每个都指向一个元素数组,
- 每个元素数组具有相同的大小。
(如果这是关于C ++:不要使用指针到指针语法,而是坚持使用类似于此的1d表示。)