【问题标题】:Print a square matrix using pointers使用指针打印方阵
【发布时间】:2014-01-12 14:27:15
【问题描述】:

我浏览过以前回答的有关指针和矩阵的问题,但在这些情况下,矩阵被视为指向指针的指针。但是,我正在尝试创建一个函数,该函数使用一个简单的指针和另一个打印矩阵的函数来读取矩阵。 这是我的代码,读取功能似乎工作正常,但程序在打印部分崩溃。如果我从 printf 语句中删除“*”,程序就可以工作(即它打印从 4 到 4 的数字——我想这没问题,因为 int 存储在 4 个字节上)。

void readm(int *p,int n)
{
 p=(int *)malloc(sizeof(int)*n*n);
 for(int i=0;i<n*n;i++)
        scanf("%d",p+i);
}

void printm(int *p,int n)
{
  for(int i=0;i<n;i++)
  {
    for(int j=0;j<n;j++)
        printf("%d ",*(p+(i*n)+j));
      printf("\n");
  }
}

【问题讨论】:

标签: c pointers matrix


【解决方案1】:

readm 函数中,您对这一行有问题:

p=(int *)malloc(sizeof(int)*n*n);

在这里你只分配给你的指针的本地副本。您在调用readm 时使用的变量将不会被更改。

你需要“通过引用”传递指针:

void readm(int **p,int n)  /* Note pointer-to-pointer for `p` */
{
    *p=malloc(sizeof(int)*n*n);  /* Note pointer-dereference of `p` */
    for(int i=0;i<n*n;i++)
        scanf("%d",*p+i);  /* Note pointer-dereference of `p` */
}

然后你必须使用地址运算符来调用函数:

int *p;
readm(&p, X);  /* Note use of address-of operator */

【讨论】:

  • 谢谢,现在可以正常使用了。最初我认为考虑到我正在使用指针,它在函数中遭受的修改将在外部可见(我将此与当您希望参数的修改在外部可见时相关联函数你使用“&”传递它,因此使用它的地址。)
【解决方案2】:

一维数组的指针定义如下:

int *p1dArr;

指向二维数组的指针定义如下:

int **p2dArr;

您正在使用一维数组,就好像它是一个二维数组。这可能是你烦恼的根源。将您的函数定义更改为以下内容:

void readm(int **p, int row, int col)
{
    p = malloc(row * sizeof(*p));
    for(int r = 0; r < row; r++)
        p[r] = malloc(col * sizeof(**p))

    for(int r = 0; r < row; r++)
        for(int c = 0; c < col; c++)
            scanf("%d", &p[r][c]);
}

void printm(int **p, int row, int col)
{
    for(int r = 0; r < row; r++)
    {
        for(int c = 0; c < col; c++)
            printf("%d ", p[r][c]);
        printf("\n");
    }
}

【讨论】:

    【解决方案3】:

    问题是调用函数readm的调用代码不知道函数变量p(定义为函数的参数)内部有一个新值。 p是函数的局部变量,退出函数后生命结束。

    你应该按照以下方式定义函数

    void readm( int **p, int n )
    {
      *p = (int *)malloc( sizeof(int ) * n * n);
      for ( int i=0; i<n*n; i++ ) scanf( "%d", *p+i );
    }
    

    并将其称为

    int *p;
    
    readm( &p, n );
    

    至于函数printm则不需要重新声明为

    void printm(int **p, int n)

    因为它不会改变指针。我唯一要改变的是添加限定符 const

    void printm( const int *p, int n );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多