博客
关于我
(一)函数与指针
阅读量:797 次
发布时间:2023-03-28

本文共 1955 字,大约阅读时间需要 6 分钟。

函数与指针

1. 指针作为函数参数

指针变量可以作为函数的形参。这种情况下,实参传递的是数据的地址,函数的形参则接收这个地址。由于形参和实参指向同一内存空间,函数对形参进行修改会直接影响到实参所指的数据。尽管被调函数无法修改实参指针的值,但它可以改变实参指针所指的变量。

2. 返回指针值的函数

函数的返回值可以是指针类型。这种函数被称为指针函数。需要注意的是,函数返回的指针不能指向本地局部变量,因为这些变量在函数结束后会被释放,导致指针失效。

3. 指向函数的指针

程序运行时,每个函数占用一段内存空间,其首地址称为入口地址。编译系统用函数名表示这个地址。函数名是一个常量,可以用来定义指针变量存储函数入口地址。这样的变量称为函数指针变量。

函数指针变量只能指向某一类函数中的一个,前提是函数的形参类型和顺序、返回值类型一致。函数指针与普通变量指针本质相同,都是内存地址的指向。区别在于,普通变量指针指向数据区,而函数指针指向函数指令区。

4. 代码示例

#include 
using 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;
}

5. 函数指针作为函数形参

函数指针变量可以作为函数的形参。例如,ptrParamAddArray 函数接受一个函数指针作为第三个参数,并通过该指针调用函数来完成任务。这种方式在某些高级编程场景中非常有用。

转载地址:http://qahfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现切换数字的符号switchSign算法(附完整源码)
查看>>
Objective-C实现列主元高斯消去法(附完整源码)
查看>>
Objective-C实现创建多级目录(附完整源码)
查看>>
Objective-C实现删除重复的字母字符算法(附完整源码)
查看>>
Objective-C实现判断32位的数字是否为正数isPositive算法(附完整源码)
查看>>
Objective-C实现十进制转N进制算法(附完整源码)
查看>>
Objective-C实现十进制转八进制算法(附完整源码)
查看>>
Objective-C实现华氏温度转摄氏温度(附完整源码)
查看>>
Objective-C实现单例模式(附完整源码)
查看>>
Objective-C实现单向链表的反转(附完整源码)
查看>>
Objective-C实现单向链表的反转(附完整源码)
查看>>
Objective-C实现单字母密码算法(附完整源码)
查看>>
Objective-C实现单循环链表算法(附完整源码)
查看>>
Objective-C实现单词计数(附完整源码)
查看>>
Objective-C实现单链表反转(附完整源码)
查看>>
Objective-C实现博福特密码算法(附完整源码)
查看>>
Objective-C实现卡尔曼滤波(附完整源码)
查看>>
Objective-C实现卡尔曼滤波(附完整源码)
查看>>
Objective-C实现卡尔曼滤波(附完整源码)
查看>>
Objective-C实现压缩文件夹(附完整源码)
查看>>