# 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;
}
(adsbygoogle = window.adsbygoogle || []).push({});