我有以下内容:
struct matrix {
int h;
int w;
int** data;
};
int m1[2][2] = {
{1, 2},
{3, 4}
};
int m2[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
struct matrix matrix1 = {2, 2, m1};
struct matrix matrix2 = {3, 3, m2};
这使得错误从不兼容的指针类型'初始化。我应该使用什么指针类型?
答案 0 :(得分:2)
您声明的矩阵不是指向指针的指针。使用简单的指针指向其元素。
#include <stdio.h>
struct matrix {
int h;
int w;
int* data;
};
int m1[2][2] = {
{1, 2},
{3, 4}
};
int m2[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
struct matrix matrix1 = {2, 2, &m1[0][0]};
struct matrix matrix2 = {3, 3, &m2[0][0]};
int main(int argc, char **argv)
{
int i, j;
for (i=0; i<matrix2.h; i++)
for(j=0; j<matrix2.w; j++)
printf("%d ", matrix2.data[(i*matrix2.h)+j]);
printf("\n");
}
修改强>
要回答评论,您可以使用复合文字,如下所示。这样您就可以使用[i][j]
#include <stdio.h>
struct matrix {
int h;
int w;
int** data;
};
int *m2[3] = {
(int[]){1, 2, 3},
(int[]){4, 5, 6},
(int[]){7, 8, 9}
};
struct matrix matrix2 = {3, 3, m2};
int main(int argc, char **argv)
{
int i, j;
for (i=0; i<matrix2.h; i++)
for(j=0; j<matrix2.w; j++)
printf("%d ", matrix2.data[i][j]);
printf("\n");
}
答案 1 :(得分:2)
2d数组不是指向指针的指针。
如何使用void *。
#include <stdio.h>
struct matrix {
int h;
int w;
void *data;
};
int m1[2][2] = {
{1, 2},
{3, 4}
};
int m2[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
struct matrix matrix1 = {2, 2, m1};
struct matrix matrix2 = {3, 3, m2};
int main(void){
int i, j;
int (*matp)[matrix2.w] = matrix2.data;//Back from the void* to pointer to array
for (i=0; i<matrix2.h; i++){
for(j=0; j<matrix2.w; j++)
printf("%d ", matp[i][j]);
puts("");
}
printf("\n");
return 0;
}
答案 2 :(得分:2)
您可能对C99的可变长度数组感兴趣。此解决方案并未直接回答您关于如何使用正确键入的data
初始化结构的问题(一个不能);但是你可以使用一个简单的指针来存储数组的地址,然后在使用struct matrix
时转换为可变长度数组指针。
用户方只需调用类似printFroMat()
的函数,它接收类型为struct matrix
的单个参数;代码 inside 这些函数(可以说,库实现)会执行有点难看的演员表,如图所示。 typedef
使得演员可能更容易理解,因为它演示了声明中变量名称的位置。
请注意,有趣的sizeof(m2)/sizeof(*m2)
等并非绝对必要,您可以说3
。但sizeof
表达式会自动与实际矩阵大小保持同步,这很快就会成为真正的资产。
你可以传递“数组”(事实上:仍然只是地址,但是已知的数组类型)以及它们的维度作为函数的参数,并以正常方式对它们进行索引(在printMatrix
下面)。例如:
#include<stdio.h>
#include<string.h>
struct matrix {
int h;
int w;
int *data; // first element of matrix
};
int m2[4][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
{10, 11, 12}
};
void printMatrix(int dim1, int dim2, int mat[][dim2] )
{
printf("Address of matrix: %p\n", (void *)mat);
for(int i1=0; i1<dim1; i1++)
{
for(int i2=0; i2<dim2; i2++)
{
printf("%d ", mat[i1][i2]);
}
putchar('\n');
}
}
void printFromMat(struct matrix mat)
{
printMatrix(mat.h, mat.w, (int (*)[mat.w])mat.data);
// or:
typedef int (*mT)[mat.w];
printMatrix(mat.h, mat.w, (mT)mat.data);
}
int main()
{
printMatrix( sizeof(m2) /sizeof(*m2), // number of highest-order elements
sizeof(*m2)/sizeof(**m2), // number of second-order elements per highest-order
m2 ); // address of the first sub-array
struct matrix mat = { sizeof(m2) /sizeof(*m2), sizeof(*m2)/sizeof(**m2), *m2 };
printFromMat(mat);
return 0;
}
示例会话:
$ gcc -std=c99 -Wall -o 2d-matrix 2d-matrix.c && ./2d-matrix
Address of matrix: 0x100402020
1 2 3
4 5 6
7 8 9
10 11 12
Address of matrix: 0x100402020
1 2 3
4 5 6
7 8 9
10 11 12
Address of matrix: 0x100402020
1 2 3
4 5 6
7 8 9
10 11 12
答案 3 :(得分:0)
您可能不会像
那样初始化结构struct matrix matrix1 = {2, 2, m1};
struct matrix matrix2 = {3, 3, m2};
因为没有从int ( * )[2]
和int ( * )[3]
类型转换为类型int **
我建议动态地为数组的副本分配内存。
该方法可以按照以下方式进行,如演示程序中所示
#include <stdlib.h>
#include <stdio.h>
struct matrix
{
size_t h;
size_t w;
int **data;
};
int m1[2][2] =
{
{ 1, 2 },
{ 3, 4 }
};
int m2[3][3] =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
struct matrix init( size_t h, size_t w, int a[h][w] )
{
struct matrix matrix = { 0 };
matrix.data = malloc( h * sizeof( int * ) );
if ( matrix.data )
{
matrix.h = h;
matrix.w = w;
for ( size_t i = 0; i < h; i++ )
{
matrix.data[i] = malloc( w * sizeof( int ) );
if ( matrix.data[i] )
{
for ( size_t j = 0; j < w; j++ ) matrix.data[i][j] = a[i][j];
}
}
}
return matrix;
}
int main( void )
{
struct matrix matrix1 = init( 2, 2, m1 );
struct matrix matrix2 = init( 3, 3, m2 );
for ( size_t i = 0; i < matrix1.h; i++ )
{
for ( size_t j = 0; j < matrix1.w; j++ ) printf( "%d ", matrix1.data[i][j] );
printf( "\n" );
}
printf( "\n" );
for ( size_t i = 0; i < matrix2.h; i++ )
{
for ( size_t j = 0; j < matrix2.w; j++ ) printf( "%d ", matrix2.data[i][j] );
printf( "\n" );
}
printf( "\n" );
// free allocated arrays of matrix1 and matrix2
}
程序输出
1 2
3 4
1 2 3
4 5 6
7 8 9
您还需要编写一个函数来释放结构的已分配内存。
编译器必须支持可变长度数组。