二维数组打印

今天有人问到二维数组传参的事情,自己尝试着写了下。

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");
}
}


总结:

基础要时时刻刻夯实才好,虽然一般都是用指针,但是多级指针的确很考对指针的理解。谨记之。

 





 

posted @ 2012-03-06 20:49  westfly  阅读(514)  评论(0编辑  收藏  举报