hur.cn - 华软网

 热门搜索

double** 转成 double* a[4]

  作者:未知    来源:网络    更新时间:2011/5/17
我的一个函数是接收二维数组的用的是
fn(int* a[4])

而我的二维数组是用下面方法生成
int** m;
m=new int*[4];
for (int i=0;i<4;i++)
{
    m[i] = new  int[4];
}

我的要求是不能改变函数的参数类型,
并且将动态开辟的二维数组传递给函数。

请大家帮帮忙,谢谢!!
---华软 网友回答---
fn(m)
---华软网友回复---
fn的参数是指针数组
---华软网友回复---
不好意思,刚才又看了一下,修改问题如下
首先不是fn(int* a[4])---------可接收int**
而是fn(int (*a)[4])----------可接收int m[4][4];中的m

原来传递的都是int a[4][4],直接将fn(a)传递即可
而现在出现了一个int**  如何能传给fn(int (*a)[4]


---华软网友回复---
fn( ((*)[4])m )

typedef (* MY_TYPE)[4];
fn((MY_TYPE)m)
---华软网友回复---
不过不建议这么用,
C++">
int** m;
m=new int*[4];
for (int i=0;i<4;i++)
{
  m[i] = new int[4];
}

m的空间不一定是连续的
就是说你的函数中a[1][0]很有可能不等于m[1][0]
---华软网友回复---
引用 5 楼 lyyscf 的回复:
不过不建议这么用,
C/C++ code

int** m;
m=new int*[4];
for (int i=0;i<4;i++)
{
  m[i] = new int[4];
}

m的空间不一定是连续的
就是说你的函数中a[1][0]很有可能不等于m[1][0]


那请问如何用比较好,谢谢
---华软网友回复---
还有 fn(((*)[4])m);
会出错
error C2059: syntax error : ')'
其余地方是不少括号的,是不是这句的语法有问题啊?
---华软网友回复---
C++">
void fun(int a[][4], int row)
{
  for(int i=0; i<row; i++)
  {
    for(int j=0; j<4; j++)
    {
      TRACE(_T("a[%d][%d]=%d\n"),
        i, j, a[i][j]);
    }
  }
  
}


---华软网友回复---
引用 8 楼 zgl7903 的回复:
C/C++ code

void fun(int a[][4], int row)
{
  for(int i=0; i<row; i++)
  {
    for(int j=0; j<4; j++)
    {
      TRACE(_T("a[%d][%d]=%d\n"),
        i, j, a[i][j]);
    }
  }
  
}

感谢回答,不过我的问题是int** 如何能传给fn(int (*a)[4]
谢谢
---华软网友回复---
或者如何将int a[4][4]  传递给int××
即将a编程int××类型的
---华软网友回复---
int (*a)[4] 是函数指针吧,为什么要把变量的地址赋给函数?

---华软网友回复---
我来解决吧. 楼主等一下. 这个问题强转一下就可以了.

PS 楼上 :  函数指针和 数组指针类型 语法上长的很像, 但2者不一样, 后者几乎没人用过.
---华软网友回复---

代码说话,注释很清楚了.
以下语法可能有点蛋疼.注意看清.


#include<iostream>
using namespace std;
int a[3][3];
int (&b)[3][3]=a; //b可以完全替代a,进行使用.
int (*a1)[3]=(int (*)[3])a; //a1是a的一维指针数组形式,数组类型维int *
int **a2=(int **)a; //a2是a的2级 指针形式,指向类型为int

//通过引用b将 a初始化为0
void Init0()
{
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
b[i][j]=0;
}
//通过引用b将 a初始化为1~9
void Init1()
{
for(int i=0;i<3;++i)
for(int j=0;j<3;++j)
b[i][j]=i*3+j+1;
}
//显示a
void show()
{
for(int i=0;i<3;++i)
{
for(int j=0;j<3;++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
//参数形式为2维数组
void func1(int (&_a)[3][3])
{
_a[1][0]=4;
_a[2][0]=7;
}
//参数形式为一维指针数组
void func2(int (*_a)[3])
{
//这里无需额外的处理来恢复数组的类型信息,编译器已知每一行的个数
//而该类型(int *[3]) 的指针的 数字计算能正确的处理每一行的个数
//也即 p+=2,编译器就知道将p加上2行的个数,
//所以不必操心了.
_a[1][1]=5;
_a[2][1]=8;
}
//参数形式为2级指针  int * * 
void func3(int **_a)
{
//这里需要转换成正确的类型,才能恢复数组的结构,编译器无法知道数组每行的个数
//通过一个2级指针 转换得出2维数组的引用.
         int (& _c)[3][3] =*((int (*)[3][3])(_a));

//   相当于下面2行代码的效果, 先得出指针,再转换成引用.这样后续就可以使用[][]了.
//   int (*_c)[3][3] =(int (*)[3][3])(_a);
// int (& _c)[3][3]=*_c;

        _c[1][2]=6;
_c[2][2]=9;
}
// 光通过第一行的值1,2,3来验证是否转换正确是不够的, 
// 只有第2行也对才能说明编译器正确的理解了数组结构
//
// 多维数组的语法也是类似的,只是更加复杂
//

void main()
{
   Init1();
   show();//展示通过引用b可以代替对a的使用
   Init0();
   show();//初始化为0
   func1(a);
   show();//展示2维数组访问是没问题的
   func2(a1);
   show();//展示一维指针数组访问是没问题的
   func3(a2);
   show();//展示2级指针访问是没问题的
}

   
    搞完收工.
    相关语法知识, 我只在一本书上见过, 貌似是C++ PRIMER.也许我记错了.
    那我也不知道我从哪里看的了.......

---华软网友回复---
    函数指针和数组指针 语法上大体一样. 它们2个语法 都很蛋疼.前者很多书都会提,后者我就只见过一本书谈到了. 可能是我孤陋寡闻吧.
    我很喜欢C++ Primer,因为它经常会归纳或提及一些蛋疼的语法,和某些蛋疼的细节,而其它书和文章上很少看到.
---华软网友回复---

fn( (int(*)[4])m )
//或
typedef int (* MY_TYPE)[4];
fn((MY_TYPE)m)

//最好这么用
int **a;
int *pTmp = new int[4 * 4];
a = (int **)pTmp;

---华软网友回复---
结贴.........      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。