1指针做函数的形参
指针变量可以做函数的形参,对应的实参用地址或指针变量。函数调用时传入的是数据的地址,因此形参和实参指向主调函数中的同一片内存空间,函数改变形参指向的变量的值,则对应实参指向的值也将改变。因此,尽管被调函数不能改变实参指针的值,但可改变实参指针所指变量的值。
2.返回指针值的函数
函数的返回值可以是指针,返回值类型是指针的函数也被称为指针函数。因本函数执行完毕返回主调函数后,函数中的局部变量将被全部释放,因此指针函数的返回值不能是本函数中的局部变量的地址。
3.指向函数的指针
程序运行时,一个函数包含的指令序列要占据一段内存空间,这块内存空间的首地址称为函数的入口地址,编译系统用函数名代表这一地址。函数的入口地址为函数的指针,简称函数指针。函数名是函数的指针常量,可以定义指针变量,用来存放函数的入口地址,这种存放函数入口地址的变量称为指向函数的指针变量,简称函数指针变量。
用函数名调用函数称为函数的直接调用,用函数指针变量调用函数称为函数的间接调用。
一个函数指针变量只能指向某类函数中的一个,要求该函数的形参个数\类型\顺序相同且返回值类型也相同,只是函数名不同。
函数指针与普通类型变量指针本质相同,都是内存地址,区别是普通变量的指针指向内存中的数据区,函数指针指向内存中的函数指令区。
4.代码示例
#include <iostream>
using namespace std;
void swap(int *a, int *b);
int *addArray(int *array, size_t size);
int *ptrParamAddArray(int *array, size_t size, int *(*p)(int *, size_t));
int main(int argc, char **argv)
{
// 指针变量做函数形参
int x = 1, y = 2;
cout << "before swap: " << "(x,y) = " << x << "," << y << endl;
swap(&x, &y);
cout << "after swap: " << "(x,y) = " << x << "," << y << endl;
// 指针变量做函数形参,返回值是指针类型的函数
int a[2] = {2, 3};
cout << "before add: " << "(a[0], a[1]): " << a[0] << "," << a[1] << endl;
int *p = addArray(a, 2);
cout << "after add: " << "(a[0], a[1]): " << p[0] << "," << p[1] << endl;
// 定义指向函数的指针变量
void (*fp)(int*, int*);
fp = swap;
cout << "before pswap: " << "(x,y) = " << x << "," << y << endl;
fp(&x, &y);
cout << "after pswap: " << "(x,y) = " << x << "," << y << endl;
// 定义指向返回值是指针类型函数的指针变量
int *(*fpa)(int *, size_t);
fpa = addArray;
cout << "before fpa add: " << "(a[0], a[1]): " << a[0] << "," << a[1] << endl;
p = fpa(a, 2);
cout << "after fpa add: " << "(a[0], a[1]): " << p[0] << "," << p[1] << endl;
// 函数指针作为函数的形参
cout << "before pfpa add: " << "(a[0], a[1]): " << a[0] << "," << a[1] << endl;
p = ptrParamAddArray(a, 2, fpa);
cout << "after pfpa add: " << "(a[0], a[1]): " << p[0] << "," << p[1] << endl;
return 0;
}
// 指针做函数参数
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
// 返回指针的函数
int *addArray(int *array, size_t size)
{
for(size_t i = 0; i < size; i++)
{
array[i] += i;
}
return array;
// // return pointer of local variable[error]
// int p[2] = {4, 5};
// int *r = p;
// return r;
}
// 函数指针做函数形参的函数
int *ptrParamAddArray(int *array, size_t size, int *(*p)(int *, size_t))
{
int *tmp = p(array, size);
array = tmp;
return array;
}