1

我是 C++ 新手,我正在尝试学习指针。作为一项工作练习,我尝试使用指向指针的指针来读取 nxn 矩阵。到目前为止,这是我尝试过的,但是 scanf 失败了。我究竟做错了什么?
后期编辑:

int **matrix;
int i=0;
int j=0;
int li=0;
int dim;

printf("What is the dimmension:");
scanf("%d",&dim);
matrix=(int **)malloc(sizeof(int *) * dim);
for(li=0;li<dim;li++)
{
    matrix[li] = (int *)malloc(sizeof(int) * dim);
}
printf("Type the elements:\n");
for(i=0;i<dim;i++)
{
    for(j=0;j<dim;j++)
    {
        scanf("%d", matrix[i][j]);
    }
}
4

5 回答 5

2

如果您使用的是 C++,最好这样做

matrix = new int*[dim];
for(int = 0; i < dim; ++i)
    matrix[i] = new int[dim];

// to read matrix
scanf("%d", matrix[i][j]);
于 2012-04-16T17:18:21.743 回答
1

您有两个(半个)主要选择。您可以单独分配每一行,

matrix = malloc(dim * sizeof(int*));  // gives you dim int*
for(i = 0; i < dim; ++i)
{
    matrix[i] = malloc(dim * sizeof(int)); // row i gets dim int
}

或者你可以分配一个连续的块

int *array = malloc(dim*dim*sizeof(int));

并使用

array[i*dim + j];

half 选项是使用打包的内存布局,但有一个包装器来访问它matrix[i][j]

int **matrix = malloc(dim*sizeof(int*));
for(i = 0; i < dim; ++i)
{
    matrix[i] = array + i*dim;
}

(当然,在 C++ 中,您通常不会malloc使用new和/或标准库提供的其他类型。)

于 2012-04-16T17:26:40.097 回答
0

如果您尝试创建指针数组,其中每个指针都指向一行,那么您实际上需要自己为每一行创建指针。这是代码:

//为M*N(或N*N)

int **a;
a=malloc(M*sizeof(int *));
for(i=0;i<M;i++)
    a[i] = &aa[i][0];

使用该代码,您将一个指针分配给一个大型 malloc,然后将一部分 malloc 分配给每行的第一个元素!这允许您使用传统的二维数组 a[0][0]、a[1][1]、ec 取消对数组的引用。这是我解释这一点的最佳参考:http: //www.eskimo.com/~scs/cclass/int/sx9b.html

于 2012-04-16T17:25:28.610 回答
0

你应该能够像普通的二维数组一样访问它,matrix[i][j]然后scanf使用它的位置

scanf("%d", &matrix[i][j]);

编辑还需要自己分配指针:

matrix=(int **)malloc(sizeof(int *) * dim);
for(i = 0; i < dim; i++) {
    matrix[i] = (int *)malloc(sizeof(int) * dim);
}

此外,如果这是直接C的,您不应该从 malloc 转换返回类型,因为C它会自动升级并且转换可以隐藏错误。

于 2012-04-16T17:17:39.623 回答
0

您已经分配了指向指针的顶级数组,但没有将下一级指针设置为任何分配的内存。循环为每个指针matrix[i]分配一个块,或者将每个指针设置为现有分配的内存,然后它可以被scanf使用。

于 2012-04-16T17:17:59.327 回答