我是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]);
}
}
答案 0 :(得分: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]);
答案 1 :(得分: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];
半选项是使用打包内存布局,但有一个包装器可以使用matrix[i][j]
访问它:
int **matrix = malloc(dim*sizeof(int*));
for(i = 0; i < dim; ++i)
{
matrix[i] = array + i*dim;
}
(当然,在C ++中,您通常不会malloc
,而是使用new
和/或标准库提供的其他类型。)
答案 2 :(得分: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
会自动升级它,并且强制转换可以隐藏错误。
答案 3 :(得分:0)
您已经分配了指针指针的顶级数组,但没有设置指向任何已分配内存的下一级指针。为每个指针矩阵[i]创建一个malloc循环,或者将每个指针设置为现有的已分配内存,然后scanf可以使用它。
答案 4 :(得分:0)
如果您正在尝试执行指针数组,其中每个指针指向一行,您实际上需要自己为每行指针。这是代码:
// forM * N(或N * N)
int **a;
a=malloc(M*sizeof(int *));
for(i=0;i<M;i++)
a[i] = &aa[i][0];
使用该代码,您可以指定一个指向大型malloc的指针,然后将malloc的一大块分配给每一行的第一个元素!这允许你使用传统的2d数组a [0] [0],a [1] [1],ec来取消引用数组。 以下是解释此问题的最佳参考: http://www.eskimo.com/~scs/cclass/int/sx9b.html