如何将m矩阵传递给foo()?如果我不被允许更改foo()的代码或原型?
void foo(float **pm)
{
int i,j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
printf("%f\n", pm[i][j]);
}
int main ()
{
float m[4][4];
int i,j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
m[i][j] = i+j;
foo(???m???);
}
答案 0 :(得分:15)
如果你坚持上述foo
的声明,即
void foo(float **pm)
并使用内置的2D数组,即
float m[4][4];
然后让foo
与m
一起使用的唯一方法是创建一个额外的“行索引”数组并传递它而不是m
...
float *m_rows[4] = { m[0], m[1], m[2], m[3] };
foo(m_rows);
无法直接将m
传递给foo
。是不可能的。参数类型float **
与参数类型float [4][4]
绝对不兼容。
此外,由于C99,以上可以更紧凑的方式表达,
foo((float *[]) { m[0], m[1], m[2], m[3] });
P.S。如果仔细观察,你会发现这与Carl Norum在答案中建议的基本相同。除了Carl是malloc
- 数组内存,这不是绝对必要的。
答案 1 :(得分:8)
如果您无法更改foo()
,则需要更改m
。将其声明为float **m
,并适当地分配内存。然后拨打foo()
。类似的东西:
float **m = malloc(4 * sizeof(float *));
int i, j;
for (i = 0; i < 4; i++)
{
m[i] = malloc(4 * sizeof(float));
for (j = 0; j < 4; j++)
{
m[i][j] = i + j;
}
}
之后不要忘记free()
!
答案 2 :(得分:3)
你做不到。 m
与foo
的参数不兼容。你必须使用一个临时的指针数组。
int main()
{
float m[4][4];
int i,j;
float *p[4];
p[0] = m[0];
p[1] = m[1];
p[2] = m[2];
p[3] = m[3];
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
m[i][j] = i+j;
foo(p);
答案 3 :(得分:2)
如果您的编译器支持当前的C标准C99,那么您可以这样做:
foo((float *[]){ m[0], m[1], m[2], m[3] });
(请注意,这与AndreyT的答案完全相同,只是它放弃了必须命名临时数组)
答案 4 :(得分:2)
您不需要在main中进行任何更改,但如果将函数的正式原型更改为(* pm)[4]或pm [] [4],则函数将正常工作,因为** pm表示指向整数指针的指针,而(* pm)[4]或pm [] [4]表示指向4个整数的poiner的指针。
这里也是指向4个整数指针的指针,而不是指向整数指针的指针,因此不兼容。
#include<stdio.h>
void foo(float (*pm)[4])
{
int i,j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
printf("%f\n", pm[i][j]);
}
int main ()
{
float m[4][4];
int i,j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
m[i][j] = i+j;
foo(m);
}
答案 5 :(得分:0)
foo(m)
不起作用吗?
答案 6 :(得分:0)
void foo(float **pm)
与void foo(float *pm[])
相同,不是二维浮点数组。它是float*
的数组。现在,那些float*
本身可能指向浮点数组,但这是一个单独的问题。
答案 7 :(得分:0)
typedef float Float4[4];
void foo(Float4 *pm)
{
int i,j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
printf("%f\n", pm[i][j]);
}
main()
{
Float4 m[4];
int i,j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
m[i][j] = i+j;
foo(m);
return 0;
}
答案 8 :(得分:0)
使用支持运行时大小的数组的C99,以下是传递2-dim数组的可能方法:
void foo(void *pm, int row, int col)
{
float (*m)[col] = pm;
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
printf("%4.1f%s", m[i][j], (j == col-1)?"\n":" ");
}
int main()
{
float m[4][4];
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
m[i][j] = i+j;
foo(m, 4, 4);
return 0;
}