将指针增加到结构中的数组

时间:2012-01-03 16:23:32

标签: c pointers structure

我在这方面遇到了一些麻烦,并在互联网上寻找帮助的高低,但无济于事。 我基本上试图创建一个随机矩阵并将其打印出来,我有一个函数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->data)指针。我听说过当你调用箭头操作符时它会自动递增,但它似乎没有工作,当我尝试*(mat->data)++时,我得到了一个很大的错误。

感谢一百万人,任何帮助都会很棒。

4 个答案:

答案 0 :(得分:4)

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

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

这样的事情:

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

(引用i * mat->columns + j指向的内存块中的double mat->data,并且:

      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->data不是一个好主意。

答案 1 :(得分:0)

你应该做mat-&gt; data ++。 (mat-&gt; data)++正在评估mat-&gt;数据的值并尝试递增它,这是不可能的。

答案 2 :(得分:0)

这里:`printf(“\ t%1.2lf”,*(mat-&gt; data));'你总是指着同样的记忆。

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

(mat->data)[2]

答案 3 :(得分:0)

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

您可以通过多种方式在columns中执行此操作。但以下是最常见的做法之一。这缺乏解除分配,即C。请尝试自己动手,如果您需要帮助我们就在这里!

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

free()