本文共 1955 字,大约阅读时间需要 6 分钟。
指针变量可以作为函数的形参。这种情况下,实参传递的是数据的地址,函数的形参则接收这个地址。由于形参和实参指向同一内存空间,函数对形参进行修改会直接影响到实参所指的数据。尽管被调函数无法修改实参指针的值,但它可以改变实参指针所指的变量。
函数的返回值可以是指针类型。这种函数被称为指针函数。需要注意的是,函数返回的指针不能指向本地局部变量,因为这些变量在函数结束后会被释放,导致指针失效。
程序运行时,每个函数占用一段内存空间,其首地址称为入口地址。编译系统用函数名表示这个地址。函数名是一个常量,可以用来定义指针变量存储函数入口地址。这样的变量称为函数指针变量。
函数指针变量只能指向某一类函数中的一个,前提是函数的形参类型和顺序、返回值类型一致。函数指针与普通变量指针本质相同,都是内存地址的指向。区别在于,普通变量指针指向数据区,而函数指针指向函数指令区。
#includeusing namespace std;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;}int *ptrParamAddArray(int *array, size_t size, int *(*p)(int *, size_t)) { int *tmp = p(array, size); array = tmp; return array;}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; p = ptrParamAddArray(a, 2, fpa); cout << "before pfpa add: (a[0], a[1]): " << a[0] << "," << a[1] << endl; cout << "after pfpa add: (a[0], a[1]): " << p[0] << "," << p[1] << endl; return 0;}
函数指针变量可以作为函数的形参。例如,ptrParamAddArray 函数接受一个函数指针作为第三个参数,并通过该指针调用函数来完成任务。这种方式在某些高级编程场景中非常有用。
转载地址:http://qahfk.baihongyu.com/