指针与函数
函数传递的方式:
(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);
}
结果