我在学习C语言的时候,老师给了一个函数,函数功能是由下三角矩阵来求多元函数的解。
void Lower(double **L,double *b,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
b[i]-=L[i][j]*b[j];
}
b[i]=b[i]/L[i][i];
}
}
在我想要把矩阵以数组的形式传递到函数中时,遇到了一个问题,那就是二维数组的内容以怎样的形式传递到Lower函数形参中的二级指针。
我查了一些资料了解到:
二维数组和二级指针根本不是一类的,指向二维数组的指针也是一级指针,而二级指针是指向指针的指针。
int main()
{
int **p= NULL;
int L[2][2] = {1,2,3,4};
p = (int **)L;
printf("指针的长度为:%d\n",sizeof(p));
printf("值为:%d\n",*p);
p++;
printf("值为:%d\n",*p);
getchar();
return 0;
}
如果用的是32位操作系统那么得到的结果会是4,1,2;但这不代表二维数组和二级指针可以转化,只是指针的位数和int的位数一样,碰巧而已;如果使用64位操作系统得到的结果就会是:
C语言中二维数组的存储是按照一维数组的来处理的,二维数组是以行展开的形式顺序存储,所以同一维数组的空间存储分配是一样的。所以在利用二维数组作为参数传递时,必须指定二维数组的列数,否则函数无法勾画出二维数组的组织形式。
二维数组的传递方法:
1.实参形参都是二维数组
#include<stdio.h>
#include<windows.h>
void Lower(double L[][4],double *b,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
b[i]-=L[i][j]*b[j];
}
b[i]=b[i]/L[i][i];
printf("%lf \n",b[i]);
}
}
int main()
{
int i,j;
double L[4][4]={{1,0,0,0},{1,2,0,0},{1,2,3,0},{1,2,3,4}};
double b[4]={1,3,6,10};
int n=4;
Lower(L,b,n);
system("pause");
}
2.实参为二维数组形参为数组指针
比如:int (*L)[4]
#include<stdio.h>
#include<windows.h>
void Lower(double (*L)[4],double *b,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
b[i]-=L[i][j]*b[j];
}
b[i]=b[i]/L[i][i];
printf("%lf \n",b[i]);
}
}
int main()
{
int i,j;
double L[4][4]={{1,0,0,0},{1,2,0,0},{1,2,3,0},{1,2,3,4}};
double b[4]={1,3,6,10};
int n=4;
Lower(L,b,n);
system("pause");
}
3.实参为二维数组形参是二级指针
#include<stdio.h>
#include<windows.h>
void Lower(double **L,double *b,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
b[i]-=L[i][j]*b[j];
}
b[i]=b[i]/L[i][i];
printf("%lf \n",b[i]);
}
}
int main()
{
int i,j;
double L[4][4]={{1,0,0,0},{1,2,0,0},{1,2,3,0},{1,2,3,4}};
double b[4]={1,3,6,10};
int n=4;
double *p[n]; //因为指针数组是能够和二维指针直接传递的,所以声明一个指针数组
for(i=0;i<n;i++) //指针的指针要求指针地址是连续的而不要求指针的指针地址连续
{
p[i]=L[i];
}
Lower(p,b,n); //在实参传递时不能直接用L传递因为类型不匹配,所以要借助指针数组
system("pause");
}