根据这个网站,我应该可以使用以下代码:
double stuff[3][3];
double **p_stuff;
p_stuff = stuff;
但我收到投诉,转让不允许转让。
我做错了吗?
我有一个extern“C”类型的函数,我想通过这个双重的东西[3] [3]来。所以我想我需要把它作为一个指针,对吗?
答案 0 :(得分:12)
关于编辑:要将此double stuff[3][3]
传递给C函数,您可以
1)将指针传递给整个2D数组:
void dostuff(double (*a)[3][3])
{
// access them as (*a)[0][0] .. (*a)[2][2]
}
int main()
{
double stuff[3][3];
double (*p_stuff)[3][3] = &stuff;
dostuff(p_stuff);
}
2)将指针传递给第一个1D数组(第一行)和行数
void dostuff(double a[][3], int rows)
{
// access them as a[0][0] .. a[2][2]
}
int main()
{
double stuff[3][3];
double (*p_stuff)[3] = stuff;
dostuff(p_stuff, 3);
}
3)将指针传递给第一行中的第一个值以及列和行的数量
void dostuff(double a[], int rows, int cols)
{
// access them as a[0] .. a[8];
}
int main()
{
double stuff[3][3];
double *p_stuff = stuff[0];
dostuff(p_stuff, 3, 3);
}
(这最后一个选项不是严格符合标准的,因为它将指针推进到1D数组的元素(第一行)超过该数组的结尾)
如果那不是C函数,还有更多选项!
答案 1 :(得分:3)
你指定的是有缺陷的。 p_stuff;
是指向double
的指针,而stuff
是二维数组(数组数组)
单维数组衰减到指向其第一个元素的指针。二维数组衰减到指向单维数组的指针。
试试这个
double stuff[3][3];
double (*p_stuff)[3]; // pointer to array of 3 int
p_stuff = stuff;
答案 2 :(得分:1)
double ** p_stuff;
对应于指向double 的指针数组。 double stuff[3][3]
没有任何指针 - 它是一个双倍的2D数组。
答案 3 :(得分:0)
以下是你的回答:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned int uint;
uint m[10][20];
uint **ppm;
int main() {
int i;
ppm = (uint **)m;
for (i =0; i<10; ++i)ppm[i] = (uint *)&m[i];
m[1][1] = 10;
printf("0x%x vs 0x%x: %d vs %d\n", ppm,m, m[1][1], *(*(ppm+1)+1));
return 0;
}
结果在控制台屏幕上:
0x6010a0 vs 0x6010a0: 10 vs 10
答案 4 :(得分:0)
除了Cubbi的详细答案之外,以下方法很自然地将2-dim数组传递给函数:
void dostuff(void *a1, int rows, int cols)
{
double (*a)[cols] = (double (*)[cols]) a1;
// access them as a[0][0] .. a[rows-1][cols-1];
}
int main()
{
double stuff[3][3];
dostuff(stuff, 3, 3);
}
由于最新的C ++(C ++ 14)支持运行时大小的数组,因此您无需提前进行转换。