二维数组打印
今天有人问到二维数组传参的事情,自己尝试着写了下。
int main()//must return int
{
int table[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
PrintTable((int **)table,3,4);
//RowSum( table,3);
RowSum2( (int **)table,3,4);
PrintTable((int **)table,3,4);
}
函数声明为
void RowSum( int array[][4], int nrow);
void RowSum2(int **array,unsigned int nrow,unsigned int mcolum);
void PrintTable(int **array,int nrow,int mcolum);
结果实现的时候,还出错了,刚开始一般是访问内存出错了,直接退出。
RowSum 的实现最容易。
//table 中保存的为首址,传参后退化为指针
void RowSum( int A[][4], int nrow)
{
for ( int i=0; i<nrow; i++)
{
for( int j=1; j<4; j++)
A[i][0]+=A[i][j];
}
}
当传递的为二级指针时。
void RowSum2(int **array,unsigned int nrow,unsigned int mcolum)
{
for ( int i=0; i<nrow; i++)
{
for( int j=1; j<mcolum; j++)
*((int *)array+i*mcolum) +=*((int *)array+i*mcolum+j);//重点语句
}
}
刚开始想当然的以为二级指针需要两次取解引用,结果写出语句
*(*(array+i*mcolum)) +=*(*(array+i*mcolum)+j);
后来才发现,只需要一次解引用,因为一次显式的做了。
于是修改为
*(array+i*mcolum) +=*(array+i*mcolum+j);
编译器报错说
error: invalid operands of types 'int*' and 'int*' to binary 'operator+'
error: in evaluation of 'operator+=(int*, int*)'
最后对array进行(int *)的强制类型转换。
最终才得到正确的语句——如果不是这个+=,说不定错误又被隐藏了。
全部简单代码
View Code
#include <cstdio>
using namespace std;
//先要声明下,否则默认函数声明为 int fun(void);
void RowSum( int A[][4], int nrow);
void RowSum2(int **array,unsigned int nrow,unsigned int mcolum);
void PrintTable(int **array,int nrow,int mcolum);
int main()//must return int
{
int table[3][4]={1,2,3,4,2,3,4,5,3,4,5,6};
PrintTable((int **)table,3,4);
//RowSum( table,3);
RowSum2( (int **)table,3,4);
PrintTable((int **)table,3,4);
}
//数组作为函数参数传递的时候,会丢失维数信息,所以需要带nrow参数。
//table 中保存的为首址,传参后退化为指针
void RowSum( int A[][4], int nrow)
{
for ( int i=0; i<nrow; i++)
{
for( int j=1; j<4; j++)
A[i][0]+=A[i][j];
}
}
//作为扩展可以实现为,回顾二维数组的概念
void RowSum2(int **array,unsigned int nrow,unsigned int mcolum)
{
for ( int i=0; i<nrow; i++)
{
for( int j=1; j<mcolum; j++)
//*((int *)array+i*mcolum) +=*((int *)array+i*mcolum+j);
//*(*(array+i*mcolum)) +=*(*(array+i*mcolum)+j);
*(array+i*mcolum) +=*(array+i*mcolum+j);
}
}
//同理打印矩阵
void PrintTable(int **array,int nrow,int mcolum)
{
for ( int i=0; i<nrow; i++)
{
for( int j=0; j<mcolum; j++)
printf("%d\t",*((int *)array+i*mcolum+j));
printf("\n");
}
}
总结:
基础要时时刻刻夯实才好,虽然一般都是用指针,但是多级指针的确很考对指针的理解。谨记之。