【问题标题】:Incrementing a Pointer to an Array within a structure在结构中增加指向数组的指针
【发布时间】:2012-01-03 16:23:31
【问题描述】:

我在执行此操作时遇到了一些麻烦,并在互联网上搜索了 High 和 Low 寻求帮助,但无济于事。 我基本上是在尝试创建一个随机矩阵并将其打印出来,我有一个函数 double random() 可以工作并且已经过测试,并且我定义了一个结构如下:

    typedef struct matrep {
         unsigned rows, columns;
         double *data;
    } MATRIX;

我已经正确分配了内存,我使用这个和我的随机函数来创建一个随机矩阵,但结果是指针永远不会移动,

MATRIX *rand_matrix( MATRIX *mat ) 
{
    for ( int i=0; i < mat->rows; i++ )
    {
        for ( int j=0; j < mat->columns; j++ )
        {
             *(mat->data) = random() ;
        }
    }
    return mat ;
}

我知道它永远不会移动,因为当我使用此函数打印出矩阵时

void print_matrix(MATRIX *mat ) 
{
    int i, j ;
    if ( (mat->data)==0 || (mat->rows)==0 || (mat->columns)==0 )
    {
        printf("Empty matrix\n" );
        return ;       
    }
    printf( "\n\nMatrix of dimensions %d x %d\n\n", mat->rows, mat->columns) ;
    for ( i=0; i < mat->rows; i++ )
    {
        for ( j=0; j < mat->columns; j++ )
        {
            printf("\t%1.2lf", *(mat->data) );
        }
        printf("\n") ;
    }
}

并在上面的矩阵中用“j”交换随机数,它最终会打印出一个具有正确行数和列数的矩阵,但每个值都等于 j 的最大值。

基本上,我希望你能帮助我的是弄清楚如何增加我的*(mat-&gt;data) 指针。我听说当你调用箭头运算符时它会自动递增,但它似乎不起作用,当我尝试*(mat-&gt;data)++ 时,我得到了一个不错的大错误。

任何帮助都会非常感谢一百万。

【问题讨论】:

  • 它不会自动递增。

标签: c pointers structure


【解决方案1】:

您实际上并不想更改mat-&gt;data;您需要它继续指向您正确分配的内存。相反,您需要更改:

         *(mat->data) = random() ;

到这样的事情:

         mat->data[i * mat->columns + j] = random() ;

(引用mat-&gt;data指向的内存块中的i * mat-&gt;columns + jth double),这个:

      printf("\t%1.2lf", *(mat->data) );

到这样的事情:

      printf("\t%1.2lf", mat->data[i * mat->columns + j]);

(类似地)。

我听说当你调用箭头运算符时它会自动递增 […]

这不是真的,我什至想不出你可能听说过类似的东西,抱歉。


编辑添加:如果您愿意,另一种方法是编写如下内容:

MATRIX *rand_matrix( MATRIX *mat ) 
{
    double *pTmp = mat->data;
    for ( int i=0; i < mat->rows; i++ )
    {
        for ( int j=0; j < mat->columns; j++ )
        {
             *(pTmp++) = random() ;
        }
    }
    return mat ;
}

在所有元素上增加一个指针pTmp。我不知道哪种方法更清楚。但不管怎样,我认为修改mat-&gt;data不是一个好主意。

【讨论】:

  • 也许他在想--&gt;“转到”运算符。
  • 非常感谢,我尝试了第二种方法 pTmp 并且它的工作原理很吸引人,我同意弄乱 mat->data 可能没有帮助,但我想知道为什么要在混合会有所作为,肯定它只是指向与以前相同的地方吗?对不起,如果这是一个愚蠢的问题,但我真的很纠结指针
  • @Leavenotrace:这根本不是一个愚蠢的问题。额外的指针会有所不同,因为增加它是安全的。 pTmp 一开始只是指向与 mat-&gt;data 相同的位置,但 pTmp++ 部分将其向前移动了一个空格。 (这是一个“后增量”;声明 *(pTmp++) = random() 相当于声明 *pTmp = random() 后跟声明 pTmp++。)
【解决方案2】:

你应该做 mat->data++。 (mat->data)++ 正在评估 mat->data 的值并尝试增加它,这是不可能的。

【讨论】:

  • 即使我将行 *(mat->data) = random() 更改为 *(mat->data++) = random() 我仍然会得到一个每个数字都相同的矩阵现在它们都是零
  • 不要尝试*(mat-&gt;data),只需通过mat-&gt;data++来增加指针
【解决方案3】:

这里:`printf("\t%1.2lf", *(mat->data) );'你总是指向同一个内存。

您可以使用[] 运算符来索引和取消引用指针,例如:

(mat-&gt;data)[2]

【讨论】:

    【解决方案4】:

    基本上,对于使用数组存储矩阵,您需要分配与 2D 矩阵非常相似的内存,即每个矩阵(或数组)元素都应该使用 rows 的不同值唯一地访问到 columns

    您可以通过多种方式在C 中做到这一点。但以下是最常见的方法之一。这缺少取消分配,即free()。请尝试自己做,如果您需要任何帮助,我们会在这里!

    注意:我可以看到应该在您的代码中进行多项更改......所以我试图提供一个通用指南和参考作为答案!

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
            int row, column;
            int **matrix;
            int i, j, val;
    
            printf("Enter rows: ");
            scanf("%d", &row);
            printf("Enter columns: ");
            scanf("%d", &column);
    
            matrix = (int **) malloc (sizeof(int *) * row);
            for (i=0 ; i<row ; i++) 
                    matrix[i] = (int *) malloc (sizeof(int) * column);
    
            val=1;
            for (i=0 ; i<row ; i++) {
                    for (j=0 ; j<column; j++) {
                            matrix[i][j] = val++;
                    }
            }
    
            for (i=0 ; i<row ; i++) {
                    for (j=0 ; j<column; j++) {
                            printf("%3d  ", matrix[i][j]);
                    }
                    printf("\n");
            }
    
            return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 2012-12-07
      • 2016-06-20
      相关资源
      最近更新 更多