2021-01-20

指针与函数

函数传递的方式:
(1)函数调用时将实参的值传给形参
(2)函数调用返回时,由被调用函数通过return语句把函数值返回到主函数
(3)通过全局变量来传递数据
(4)利用指针作为参数在主函数与被调用函数之间传递数据

*指针作为函数的参数

函数的形参和实参均为指针变量
例如:编写一个通过指针变量来交换两个变量值的函数,在主程序中调用此函数

#include<iostream>
using namespace std;

void main()
{
	int a, b;
	int* pa, * pb;
	void swap(int* p1, int* p2);       //声明

	cin >> a >> b;
	pa = &a;
	pb = &b;
	swap(pa, pb);                      //pa pb作为实参,传递的是变量a.b的地址

	cout << "\nmain0a=" << a << ",b=" << b << endl;
	cout << "\nmain1:pa=" << *pa<< ",pb=" << *pb << endl;
}

void swap(int* p1,int* p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
	cout << "\nswap:*p1=" << *p1 << ",*p2=" << *p2 << endl;

}

结果
结果

//*p1,*p2互换,实际上是变量啊,a,b值互换

函数的形参为指针变量,用变量的地址作为调用函数的实参
1.将上一例中函数的调用改成变量的地址为实参

#include<iostream>
using namespace std;

void main()
{
	int a, b;
	
	void swap(int* p1, int* p2);       //声明

	cin >> a >> b;
	
	swap(&a,&b);                      //a,b地址作为函数的参数

	cout << "\nmain:a=" << a << ",b=" << b << endl;
	
}

void swap(int* p1, int* p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
	cout << "\nswap:*p1=" << *p1 << ",*p2=" << *p2 << endl;

}

结果
结果

//当程序转入函数时,将实参的值(地址)传给两个形参指向变量。再执行函数时,对*p1,2进行互换,实际上是ab值进行互换

注意,如果单纯的改了指向地址的话参数的值并没有变化(上一例int *temp;p1=p2;p2=temp;)

数组的指针作为函数的参数
通过传递数组的首地址/指针参数指向域的扩展,来完成对主函数中数组元素的操作

1.以为数组的指针作为函数参数
将一维数组a中元素反序输出

#include<iostream>
using namespace std;

void main()
{
	int i, a[10] = { 1,2,5,4,7,8,9,6,3,10 };
	void inv(int* x, int n);
	cout << "原数组" << endl;
	for (i = 0; i < 10; i++)
		cout << a[i] << "  ";
	cout << endl;
	inv(a, 10);
	cout << "反序输出" << endl;
	for (i = 0; i < 10; i++)
		cout << a[i] << "  ";
	cout << endl;
}

void inv(int* x, int n)
{ 
	int temp, * p, * q, m = (n - 1 )/2;
	p = x;
	q = x + n - 1;
	for (; p < x + m; p++, q--)
	{
		temp = *p;
		*p = *q;
		*q = temp;
	}

}

/*形参x为指针变量,实参x为数组名,传数组A的首地址给指针变量x,x指向数组a,inv中使指针变量p指向数组首地址(a[0])
指针变量q指向数组为尾地址(a[n-1]),x+m(m=(n-1)/2)是数组中间元素的地址。pq所指的前后元素互换*/

结果
结果

在主函数中,实参也可以用指针变量。修改上述
int *pointer=a;


inv(pointer,10);

结果不变

2.二维数组的指针作为函数参数

#include<iostream>
using namespace std;

void inarr(int(*p)[4], int m)
{
	int i, j;
	for (i = 0; i < m; i++)
		for (j = 0; j < 4; j++)
			cin >> *(*(p + i) + j);
}

void outarr(int(*q)[4], int m)
{
	int i,j;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < 4; j++)
			cout << *(*(q + i) + j) << "  ";
		cout << endl;
	}
}

void main()
{
	int a[3][4], (*p)[4];
	p = a;
	inarr(a, 3);
	outarr(p, 3);

}

结果
结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.头发掉不完.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值