【问题标题】:Why pointer to pointer is a matrix? [closed]为什么指针指针是矩阵? [关闭]
【发布时间】:2013-07-30 17:36:45
【问题描述】:

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

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

【问题讨论】:

  • 请在您的标签中指定编程语言,并提供一个代码示例来描述您的意思。
  • 如果您的矩阵元素连续存储在内存中(这很常见),您只需将指针传递给第一个元素(而不是指向指针的指针)。这完全取决于矩阵在内存中的排列方式。它可以是一个由链表表示的稀疏矩阵,或者完全是其他的东西。
  • 你知道“为什么指针是数组”吗? (在某些表达中)

标签: c++ c arrays pointers matrix


【解决方案1】:

由于运算符[] 内联实现。 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. &amp;M - 指向矩阵的指针。如果你将它增加或减少一个,你会得到一些其他数据,这很糟糕......因为sizeof(M)sizeof(int) * 7 * 6 相同
  2. &amp;M[0] 指向矩阵第一行的指针。如果增加它,您将转到下一行,因为sizeof(M[0]) 等于sizeof(int) * 7
  3. 因此,要获得指向条目的指针,您需要执行 &amp;(M[0][0])sizeof(M[0][0]) 等于 sizeof(int)

所以用所有这些来制作图表:

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

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

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

顺便说一句还有一件事,指向指针的指针并不总是矩阵。

【讨论】:

  • 如果您需要图表 read 我还在那里解释了一个二维矩阵。
  • 我认为如果您提供一个指向指针的指针最终指向矩阵的示例会有所帮助。
【解决方案2】:

为什么指向指针的指针是矩阵?

并非所有情况都如此。

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

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

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

(如果这是关于 C++:根本不要使用指针到指针的语法,而是坚持使用像 this 这样的一维表示。)

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多