为什么指针指针是一个矩阵?

我知道在某些情况下,指向指针的指针被描述为矩阵。 有人可以解释一下,为什么这种方式有效? 哪个C属性允许它?

请不要发布指针这样的答案指针并不总是矩阵。 我知道,但我想问为什么它在某些情况下是一个矩阵。

因为opeator []内联实现。 a[b]实际上是*(a + b)

所以第一个[]选择行,第二个选择列。 因此, arr[m][n]stepOne = *(arr + M) ,其中M = m * nstepTwo = 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] 。 所以让我们走相反的道路。

  1. &M - 指向矩阵的指针。 如果你增加或减少一个你将得到一些其他数据,这是不好的...因为sizeof(M)sizeof(int) * 7 * 6相同sizeof(int) * 7 * 6
  2. &M[0]指向矩阵的第一行。 如果你增加它,你将转到下一行,因为sizeof(M[0])等于sizeof(int) * 7
  3. 因此,要获得指向条目的指针,你需要做&(M[0][0])sizeof(M[0][0])等于sizeof(int)

因此,要制作出所有这些图表:

  +---+---+---+---+---+---+---+ M[0] ----> | E | | | | | | | +---+---+---+---+---+---+---+ +---+ M[0][0] ----> | E | +---+ 

我希望图形帮助,因为我不太擅长解释这些东西......

BTW还有一件事,指针指针并不总是一个矩阵。

为什么指针指针是一个矩阵?

对于每种情况都不是这样。

指针也可以是指向单个元素的指针,因此“指针指针”也可以是指向指向单个元素的单个指针的指针。

指向指针的指针是有效(密集)“矩阵”,如果

  1. 这是一个指针数组,
  2. 每个都指向一个元素数组,
  3. 每个元素数组具有相同的大小。

(如果这是关于C ++:不要使用指针到指针语法,而是坚持使用类似于此的1d表示。)