1、指针做函数参数
指针做形参,我们调用函数将实参传递给形参后,实参和形参指向相同的内存地址。也就是说、被调函数中对形参的改变影响主调函数中的实参所指对象。
指针做函数参数的作用:
a、和引用一样,达到数据双向传递的效果。
b、减少参数传递的开销(引用也一样)
c、可以通过指向函数的指针传递函数代码的首地址
#include<iostream>
using namespace std;
void swap(int* a,int* b);
int main()
{
inti=1,j=2;
swap(i,j);
cout<<i<<""<<j<<endl; //i=2,j=1
//很明显i,j的值在主调函数中改变了
return0;
}
void swap(int* a,int* b)
{
inttmp=*a;
*a=*b;
*b=tmp;
}
2、指针函数
除void之外,函数都有自己的返回值。同样指针也可以作为返回值。
返回值是指针的函数我们称之为“指针函数”,普通函数只能返回一个变量或对象。
指针型函数好处是可以在函数结束调用时将大量数据从被调函数返回到主调函数。
(当然这里需要注意的是不能返回局部变量的地址)
3、函数指针
我们知道程序运行时,数据会占用内存空间。
实际上代码也会调入内存并占用内存空间。函数名就是函数代码占用内存的首地址。
这样函数指针就是存放函数代码首地址的变量。
声明形式:
数据类型 (*函数指针名)(形参列表)
//注意指针名的括号,如果没有括号就是指针函数了
函数指针名=函数名;
#include<iostream>
using namespace std;
void swap1(int* a,int* b);
void (*funPoint)(int*,int*); //函数指针,且返回值类型、形参个数、类型都必须匹配
int main()
{
inti=1,j=2;
funPoint=swap1;
// swap1(&i,&j);
funPoint(&i,&j);//通过函数指针调用
cout<<i<<""<<j<<endl; //i=2,j=1
return0;
}
void swap1(int* a,int* b) //该函数最好不要定义为swap,不然可能调用内置的swap函数模板
{
inttmp=*a;
*a=*b;
*b=tmp;
}