user-0 提问: c语言矩阵相乘在二维数组传入参数时遇到了一些问题

回复:
user: user-0
content: 多谢，看来需要再补下基础啦

user: user-1
content: http://edu.csdn.net/course/detail/2516

user: user-1
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-2
content: 二维数组传参： http://www.cnblogs.com/wuyuegb2312/archive/2013/06/14/3135277.html

user: user-3
content: 引用 4 楼 qq_29027865 的回复://备忘录递归  #include <stdio.h>    const int L = 7;   int LookupChain(int i,int j,int **m,int **s,int *p);   int MemoizedMatrixChain(int n,int **m,int **s,int *p);      void Traceback(int i,int j,int **s);//构造最优解      int main()   {       int p[L]={30,35,15,5,10,20,25};          int **s = new int *[L];       int **m = new int *[L];       for(int i=0;i<L;i++)         {             s[i] = new int[L];           m[i] = new int[L];       }        printf("矩阵的最少计算次数为:%d\n",MemoizedMatrixChain(6,m,s,p));   	printf("矩阵最优计算次序为:\n"); 	Traceback(1,6,s);       return 0;   }    //矩阵初始化操作   int MemoizedMatrixChain(int n,int **m,int **s,int *p)   {       for(int i=1; i<=n; i++)       {           for(int j=1; j<=n; j++)           {               m[i][j]=0;           }       }       return LookupChain(1,n,m,s,p);   }    //m数组内存放矩阵链的行列信息   //m[i-1]和m[i]分别为第i个矩阵的行和列（i = 1、2、3...） int LookupChain(int i,int j,int **m,int **s,int *p)   {       if(m[i][j]>0)       {           return m[i][j];       }       if(i==j)       {           return 0;       }       int u = LookupChain(i,i,m,s,p) + LookupChain(i+1,j,m,s,p)+p[i-1]*p[i]*p[j];       s[i][j]=i;       for(int k=i+1; k<j; k++)       {           int t = LookupChain(i,k,m,s,p) + LookupChain(k+1,j,m,s,p) + p[i-1]*p[k]*p[j];           if(t<u)           {               u=t;               s[i][j] = k;           }       }       m[i][j] = u;       return u;   }      void Traceback(int i,int j,int **s)   {       if(i==j) return;       Traceback(i,s[i][j],s);       Traceback(s[i][j]+1,j,s);       printf("Multiply A %d,%d\n",i,s[i][j]); 	printf("and A %d,%d\n",(s[i][j]+1),j);   }   在这里代码中为什么用**s就行了呢,请大神帮助下  多看基础，**s是一个二级指针，你声明的是动态的二维数组。

user: user-0
content: 另外第一个的计算结果还是没有出来哈

user: user-0
content: //备忘录递归  #include <stdio.h>    const int L = 7;   int LookupChain(int i,int j,int **m,int **s,int *p);   int MemoizedMatrixChain(int n,int **m,int **s,int *p);      void Traceback(int i,int j,int **s);//构造最优解      int main()   {       int p[L]={30,35,15,5,10,20,25};          int **s = new int *[L];       int **m = new int *[L];       for(int i=0;i<L;i++)         {             s[i] = new int[L];           m[i] = new int[L];       }        printf("矩阵的最少计算次数为:%d\n",MemoizedMatrixChain(6,m,s,p));   	printf("矩阵最优计算次序为:\n"); 	Traceback(1,6,s);       return 0;   }    //矩阵初始化操作   int MemoizedMatrixChain(int n,int **m,int **s,int *p)   {       for(int i=1; i<=n; i++)       {           for(int j=1; j<=n; j++)           {               m[i][j]=0;           }       }       return LookupChain(1,n,m,s,p);   }    //m数组内存放矩阵链的行列信息   //m[i-1]和m[i]分别为第i个矩阵的行和列（i = 1、2、3...） int LookupChain(int i,int j,int **m,int **s,int *p)   {       if(m[i][j]>0)       {           return m[i][j];       }       if(i==j)       {           return 0;       }       int u = LookupChain(i,i,m,s,p) + LookupChain(i+1,j,m,s,p)+p[i-1]*p[i]*p[j];       s[i][j]=i;       for(int k=i+1; k<j; k++)       {           int t = LookupChain(i,k,m,s,p) + LookupChain(k+1,j,m,s,p) + p[i-1]*p[k]*p[j];           if(t<u)           {               u=t;               s[i][j] = k;           }       }       m[i][j] = u;       return u;   }      void Traceback(int i,int j,int **s)   {       if(i==j) return;       Traceback(i,s[i][j],s);       Traceback(s[i][j]+1,j,s);       printf("Multiply A %d,%d\n",i,s[i][j]); 	printf("and A %d,%d\n",(s[i][j]+1),j);   }   在这里代码中为什么用**s就行了呢,请大神帮助下

user: user-0
content: 已经解决了,想问一下，**S指的是什么意思呢

user: user-4
content: void Traceback(int i,int j,int **s)    改成：  void Traceback(int i,int j,int s[100][100])

user: user-0
content: 欢迎大家帮忙调试一下