CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

数组、指针及函数调用!?

楼主jobuson(小王子)2002-01-20 22:04:14 在 C/C++ / C语言 提问

函数声明为:  
  void   MatrixChain(int*   p,   int**   m,   int**   DivPos);  
  目的是传入一个数组p[],及两个两维数组m[n][n],DivPos[n][n]  
   
  但我这样调用总是不对:  
  void   main()  
  {  
  int   p[]   =   {5,   10,   3,   12,   5,   50,   6};  
  const   int   n   =   sizeof(p)/sizeof(int);  
   
  int   m[n][n];  
  int   DivPos[n][n];  
   
  MatrixChain(   p,   m,   DivPos);  
  }  
   
  或者这样也不对:  
  void   main()  
  {  
  int   p[]   =   {5,   10,   3,   12,   5,   50,   6};  
  const   int   n   =   sizeof(p)/sizeof(int);  
   
  int*   m   =   new   int   [n][n];  
  int*   DivPos   =   new   int   [n][n];  
   
  MatrixChain(   p,   m,   DivPos)  
  }  
   
  环境是VC++6.0  
  在VC中,二维以上数组的调用我总是弄不好,  
  它总说什么   cannot   convert   fron   'int[][]'   to   'int**'  
  或者cannot   convert   fron   'int[7][7]'   to   'int[][1]' //这种我看来好没有道理啊!!!  
   
  就是为了防止越界吗?还是有别的什么原因。。我觉得数组、指针的使用挺受限的!  
  还望高手指条明路!  
  回答令我满意,必给分!谢了。  
  问题点数:20、回复次数:13Top

1 楼tigermount(智者爱山,仁者爱水)回复于 2002-01-20 23:11:32 得分 1

if   you   use:*p[n*n]?Top

2 楼zgce(牧童)回复于 2002-01-20 23:59:13 得分 2

怎么看怎么就不对,你的MatrixChain函数的三个参数,第二个和第三个若只是想指向一个二维数组的话,就应该是用int*   m,   int*   DivPos呀,怎么会是个int**型的呢???  
  程序编译的提示也说得很清楚了,cannot   convert   fron   'int[][]'   to   'int**'!int[][]型和int**型不是一回事呀,不能转换的呀???Top

3 楼bluekite(人總是對於無法確定的事物感到不安)回复于 2002-01-21 00:45:55 得分 5

這裡是我的解法   :  
   
   
  void   MatrixChain(int*   p,   int*   m,   int*   DivPos)  
  {  
  for(   int   i   =   0;   i   <   4;   i++   )  
  int   j   =   *(m   +   i);  
  }  
   
   
  void   main()  
  {  
  int   p[]   =   {5,   10,   3,   12,   5,   50,   6};  
  const   int   n   =   2;  //sizeof(p)/sizeof(int);  
   
  int   m[n][n]   =   {{1,2},{3,4}};  
  int   DivPos[n][n]   =   {{5,6},{7,8}};  
   
  int*   p1   =   (int*)new   int*;  
  int*   p2   =   (int*)new   int*;  
  p1   =   m[0];  
  p2   =   DivPos[0];  
   
  MatrixChain(p,   p1,   p2);  
  }  
   
   
  我試過這樣是可以的,但我想這並不是真正的解法。。  
  因為我在MatrixChain中避開了使用Double   Pointer。。  
  還有在MatrixChain的函數裡面的m和DivPos來說,它們裡面的存儲空間並不一定是連續的。。  
   
  還是請高手們來看看吧。。  
   
  Top

4 楼tpProgramer(tp编程者)回复于 2002-01-21 09:39:49 得分 6

bluekite(bluekite) :  
   
  你的方法是对的呀,呵呵。  
   
  我们都知道数组是按照引用传送的,对一维数组   int   a[10],   传递   a   和传递   &a[0]是一样的,因为数组名代表的就是第一个元素的指针。  
   
  总结一下,就是说,数组传递的要点在于传送数组的第一个元素的地址(就是分派给数组的内存区域的起始地址)。  
   
  对于多维数组,按照多维数组的排列方式,第一个元素的地址就是最后一维的第一个元素的地址。比如   二维数组   int   b[0][10],   传递b[0]   和   &b[0][0]是一样的,   都是把内存的起始地址传递出去了。  
   
   
  根据数组这种传递方式(只传递一个起始地址),我们可以看出信息很少,所有,越界检查不是c/c++语言内置的功能,要自己控制。  
   
  Top

5 楼tpProgramer(tp编程者)回复于 2002-01-21 09:46:01 得分 0

 
  有一点忘了说。  
   
  根据上面所说的数组传递方式,可以看出对于任何维的数组,传递出去都只是一个指向起始地址的指针,所以,接收方(函数)的参数也只需要一个指针就   ok了。如下,bluekite(bluekite)写的:  
   
  void   MatrixChain(int*   p,   int*   m,   int*   DivPos);  
   
  当然,这个时候,仅仅根据表达式,你并不知道   DivPos   是多维数组。  
   
  Top

6 楼tkutt()回复于 2002-01-21 11:04:05 得分 0

gxqTop

7 楼ischuixue(吹学)回复于 2002-01-21 17:28:40 得分 0

关注Top

8 楼bluekite(人總是對於無法確定的事物感到不安)回复于 2002-01-21 22:58:01 得分 0

高手就是高手,解說的方式就是不一樣。。  
  又多學一點了,謝謝了。Top

9 楼bluekite(人總是對於無法確定的事物感到不安)回复于 2002-01-21 22:58:24 得分 0

高手就是高手,解說的方式就是不一樣。。  
  又多學一點了,謝謝了。Top

10 楼icct2000()回复于 2002-01-21 23:39:03 得分 0

如果主程序和子程序都需要使用2维数组,如何传入和传出数据?Top

11 楼hz129(古雨)回复于 2002-01-21 23:59:31 得分 6

我认为应该改成这样  
   
  函数声明为:  
  void   MatrixChain(int*   p,   int*   m,   int*   DivPos,   int   n);  
   
  void   main()  
  {  
  int   p[]   =   {5,   10,   3,   12,   5,   50,   6};  
  const   int   n   =   sizeof(p)/sizeof(int);  
   
  int   *m   =   new   (sizeof(int)   *   n   *   n);  
  int   *DivPos   =   new   (sizeof(int)   *   n   *   n);  
   
  MatrixChain(   p,   m,   DivPos,   n);  
  }  
   
  或者这样也不对:  
  void   main()  
  {  
  int   p[]   =   {5,   10,   3,   12,   5,   50,   6};  
  const   int   n   =   sizeof(p)/sizeof(int);  
   
  int*   m   =   new   int   [n][n];  
  int*   DivPos   =   new   int   [n][n];  
   
  MatrixChain(   p,   m,   DivPos,   n)  
  }  
   
  在函数MatrixChain()中,m,DivPos使用方法为:  
  原来的m[x][y]改为m[x   *   n   +   y]就行了,DivPos作相同变换。  
  Top

12 楼hz129(古雨)回复于 2002-01-22 00:01:10 得分 0

我认为应该改成这样  
   
  函数声明为:  
  void   MatrixChain(int*   p,   int*   m,   int*   DivPos,   int   n);  
   
  void   main()  
  {  
  int   p[]   =   {5,   10,   3,   12,   5,   50,   6};  
  const   int   n   =   sizeof(p)/sizeof(int);  
   
  int   *m   =   new   (sizeof(int)   *   n   *   n);  
  int   *DivPos   =   new   (sizeof(int)   *   n   *   n);  
   
  MatrixChain(   p,   m,   DivPos,   n);  
   
  delete   []m;  
  delete   []DivPos;  
  }  
   
  在函数MatrixChain()中,m,DivPos使用方法为:  
  原来的m[x][y]改为m[x   *   n   +   y]就行了,DivPos作相同变换。Top

13 楼hz129(古雨)回复于 2002-01-22 00:02:51 得分 0

不好意思,new语句又写错了,应该是  
  int   *m   =   new   int[n   *   n];  
  int   *DivPos   =   new   int[n   *   n];  
   
  Top

相关问题

  • 请问如何写函数指针结构数组的调用代码?
  • javascript如何调用Asp函数、数组
  • 函数指针数组一问
  • 函数指针数组的问题
  • CTypedPtrArray指针数组的调用问题...
  • “指向函数指针数组的指针”怎么使用?
  • 指针和函数调用的问题
  • 函数指针的声明与调用
  • 请问:如何用指针数组和函数指针做函数列表?
  • [VC的DLL函数的char*指针]VB程序调用时崩溃,帮忙看一下是否是数组越界了??!!!

关键词

  • 函数
  • divpos
  • 数组
  • matrixchain
  • 调用
  • convert fron
  • cannot
  • sizeof

得分解答快速导航

  • 帖主:jobuson
  • tigermount
  • zgce
  • bluekite
  • tpProgramer
  • hz129

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...

社区焦点:

教你怎样用C#搞笑整人
最懒惰的程序员写的Cache
程序员如何掌握专业英语
Java栈与堆
分享:让人懊恼的面试
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo