关于行和列指针形参实参对应问题:
一、列指针
int p=&a[0][0]或者int p=a[0]
有以下定义
int a[M][N],p=a[0];
则a[i][j]的地址&a[i][j]为p+iN+j,而a[i][j]为(p+Ni+j)。
二、行指针
如果将数组a的首地址赋给p,即有p=a(或者&a[0]);//这里不可以用&(&a[0][0]),因为&a[0][0]是一个表达式,即右值,而&取地址只能取左值,右值是一个临时变量,左值则占据具体空间,所以取内存的地址,必须是左值。
则p和a等价,表示二维数组第0行的首地址(行指针);
p与a[0]等价,表示地址&a[0][0](列指针);
a[0][0]和(p)[0]等价,表示数组元素a[0][0](数据);
进一步,
p+i和a+i等价,表示二维数组第i行的首地址;
(p+i)和a[i]等价,表示地址&a[i][0],是列地址;
【((p+i))[j]----((p+i)+j)----p[i][j]----a[i][j]】
1.行列指针课本上的经典题目
#include<iostream>
using namespace std;
float average(int (*p)[4],int n)//行指针
{
float aver=0;
for(int i=0;i<n;i++,p++)//i来计数,p来自加指向下一行
for(int j=0;j<4;j++)
aver=aver+(*p)[j];
aver=aver/4/n;
return aver;
}
void output(int *p,int n)
{
for(int i=0;i<n;i++,p++)
if(*p<60)
cout<<*p<<'\t';
cout<<endl;
}
int main()
{
int a[3][4]={{80,90,80,70},{60,50,70,75},{55,80,75,75}};
float aver;
aver=average(a,3);//用行指针作实参
output(a[0],12);//用列指针做实参
cout<<"average="<<aver<<endl;
return 0;
}
【int (*p)[4]-----aver=average(a,3)】
【int *p-----output(a[0],12)】
2.在类中行指针的运用
#include<iostream>
using namespace std;
class A
{
int a;
public:
A(int x=0)
{
a=x;
}
void print()
{
cout<<a<<'\t';
}
};
int main()
{
A a1[2][4];
A (*p)[4]=a1;//说明一个指向a1的指针p,并对其进行初始化
int i=0,j=0;
for(i=0;i<2;i++)
for(j=0;j<4;j++)
p[i][j]=A(i+j);
for(i=0;i<2;i++)
{
for(j=0;j<4;j++)
p[i][j].print();
cout<<endl;
}
cout<<endl;
return 0;
}