读书人

二维数组的指针有关问题

发布时间: 2012-04-19 14:36:43 作者: rapoo

二维数组的指针问题
[code=C/C++][/code]/*
根据主函数,编写一下两个函数
1:求数组a[4][4]对角线上元素的和
2:实现对数组a[4][4]的矩阵转置处理
*/
#include<stdio.h>
void convert(int *p) //数组转置
{
int i,j,t;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
t=*(p+4*i+j);
*(p+4*i+j)=*(p+4*j+i);
*(p+4*j+i)=t;
}
}

int total(int a[][4],int n) //主对角线上元素的和
{
int i,sum=0;
for(i=0;i<4;++i)
if(a[i][i]!=0)
sum+=a[i][i];
return sum;
}
int total1(int a[][4],int n) //次对角线上元素之和
{
int i,j,sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if((i+j)==3) sum+=a[i][j]; //此时仅当i+j=n-1的时候才是次对角线上的点
}
return sum;
}

void main()
{
static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int *p,i,sum,sum1;
sum=total(a,4);
sum1=total1(a,4);
printf("主对角线之和:%d\n",sum);
printf("次对角线之和:%d\n",sum1);
p=*a;
convert(p);
printf("转置后的数组是:\n");
for(i=0;i<4;++i)
printf("%d %d %d %d \n",a[i][0],a[i][1],a[i][2],a[i][3]);

}
二维数组的指针问题,main函数中p=*a,为什么用* ???????而不是p=a,或者p=&a[0][0]

[解决办法]
a是指向一维数组的指针变量,是行指针,a+i是第i行的行指针

a-->a[0]: a[0][0] a[0][1]...
a+1->a[1]:a[1][0] a[1][1]...
.
.
.
[解决办法]
p=a,

这个肯定不对,a相当与二重指针,p是一重指针。

或者p=&a[0][0]

这么写肯定是可以的,但我猜作者的意思是想表达,让p指向列的起始地址,指向单个数的指针,和指向一维数组的指针是一样的!

另外我觉得:
void convert(int *p) //数组转置
{
int i,j,t;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
t=*(p+4*i+j);
*(p+4*i+j)=*(p+4*j+i);
*(p+4*j+i)=t;
}
}
这个函数是否真能如愿工作,感觉好像,他会把数组原封不动,实际上换了两遍,还原了!我没上机试,可能我错了,别笑我!

读书人网 >C语言

热点推荐