2020-12-17关于行和列指针形参实参对应问题

关于行和列指针形参实参对应问题:
一、列指针
int p=&a[0][0]或者int p=a[0]
有以下定义
int a[M][N],p=a[0];
则a[i][j]的地址&a[i][j]为p+i
N+j,而a[i][j]为
(p+N
i+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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值