【问题标题】:Pointing to a Matrix指向一个矩阵
【发布时间】:2011-10-26 04:53:24
【问题描述】:

我想声明一个指向矩阵并从矩阵中取回值的指针:

float *p;
float ar[3][3];

[..]//give values to ar[][]

p = ar;

//Keep on printing values in the 3 X 3 matrix
for (int i = 0; i < 10; i++)
{
p = p + i;
cout << *p << ", ";
}

【问题讨论】:

  • 如果我应该使用**p指向矩阵ar[][],我怎样才能得到指向矩阵中特定元素的指针的值。

标签: c arrays pointers matrix


【解决方案1】:

我怀疑你在追求:

p = &ar[0][0];

也可以写成:

p = ar[0];

虽然您的for 循环需要使用p = p + 1; 而不是p = p + i;


如果您希望循环能够按行和列访问矩阵的成员,也可以使用指向数组的指针:

float (*p)[3];

p = ar;

for (int i = 0; i < 3; i++)
    for (j = 0; j < 3; j++)
    {
        cout << p[i][j] << ", ";
    }

【讨论】:

  • 如果我想使用双指针指向矩阵并从矩阵中取消引用值怎么办?
  • @Josh:您必须澄清“双指针”的含义。如果您的意思是double *(指向双精度的指针),那么您不能,因为矩阵存储float 值。如果您的意思是float **(指向浮点指针的指针),那么唯一的方法是创建一个包含float * 值的影子数组,指向矩阵每一行中的第一个float。也许您想要一个指向数组的指针 (float (*)[3])(请参阅更新)?
  • 我想使用 "**p" 指向 ar[][] 中的一些元素并检索这些元素(以查找矩阵的行列式),我可以这样做:** p; p = ar;值 += **(p + 1);
  • @Josh:你不能真正做到这一点,因为float **p 不是该工作的正确工具。 float **p 变量用于指向float *(或float * 的数组),并且您的示例中没有拥有任何float * 对象。你可以创建一些,但没有意义,它只是不必要的混淆。
  • @Josh:在我的第一个示例中,您可以使用指针 p 遍历矩阵,但您只需取消引用一次(*(p + i)p[i] for i in 0 ..9).
【解决方案2】:

EDIT2:我是个白痴,我不小心用float **matrix 而不是float (*matrix)[3]。 caf 一直都有正确的答案。

这是你想要的吗?

#include <stdio.h>
#include <stdlib.h>

void print_matrix(float (*matrix)[3], size_t rows, size_t cols)
{
   int i, j;
   for (i = 0; i < rows; i++)
      for (j = 0; j < cols; j++)
         printf("%f ", matrix[i][j]);
}

int main(void)
{
   float ar[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
   print_matrix(ar, 3, 3);

   return EXIT_SUCCESS;
}

编辑:您还可以:

float *row1, *row2, *row3;
row1 = ar[0];
row2 = ar[1];
row3 = ar[2];
...
float row1_total = row1[0] + row1[1] + row2[2];

【讨论】:

  • 我想使用指针来访问矩阵元素。我想要一个指针来访问矩阵中的元素并使用它们执行一些操作,而不是使用矩阵本身进行打印(如加法)
  • float **matrix 是一个指针(指向一个浮点数的指针)。您可以像我一样使用指针算术或数组表示法访问元素。
  • 所以如果我想访问存储在 ar[1][1] 中的值,我会做 **(matrix + 4)?
  • 最好使用matrix[1][1],特别是如果矩阵中的每个“行”都不在连续的内存块中。执行**(matrix + 4) 不会获得任何优势,只会降低可读性并可能导致问题。
  • 你试过这个吗?这没用;您不能将 float (*)[3] 传递给需要 float ** 的函数。
猜你喜欢
  • 2011-10-01
  • 1970-01-01
  • 2013-01-05
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多