数组、指针及函数调用!?
函数声明为:
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





