C++函数与指针:参数传递、返回值及应用实战
在C++开发中,深入理解函数与指针的关系是掌握高效编程的关键。本文将解析如何通过指针作为函数参数实现地址传递,从而在单个函数中返回多个结果或优化大数据传输;介绍如何定义返回指针的函数以处理动态生成的数据;并演示如何利用指向函数的指针变量实现回调与多态调用逻辑。
指针作函数的参数-实现地址传递
在C++中,函数名本身即代表该函数的入口地址。当我们将指针作为函数的参数时,形参接收到的是实参的内存地址。通过在函数内部对指针进行解引用(间接访问),可以直接操作主调函数中的变量,从而实现类似“引用传递”的效果。这种方法主要有三个优势:
- 修改实参值:允许被调函数直接改变调用者变量的状态。
- 带回多个结果:突破函数只能有一个`return`值的限制,通过多个指针参数同时返回不同计算结果。
- 提高传递效率:对于数组或大块连续内存,传递首地址(指针)比传递整个副本开销更小、速度更快。
第1步:通过指针交换变量值
目的:展示如何利用双指针参数在不使用全局变量的情况下,交换两个局部变量的值。
动作:编写一个接受两个整型指针的函数,通过临时变量交换指针指向的内存内容,并在`main`函数中传入变量地址进行调用。
void swap(int *px, int *py)
{
int t;
t = *px;
*px = *py;
*py = t;
}
int main()
{
int x=2, y=3;
cout<<"调用前:x="<<x<<",y="<<y<<endl;
swap(&x, &y); // 传入地址
cout<<"调用后:x="<<x<<",y="<<y<<endl;
return 0;
}
输出结果:
调用前:x=2, y=3
调用后:x=3, y=2
第2步:利用指针带回多个计算结果
目的:在一个函数执行过程中,同时计算平均值、最大值和最小值,并通过指针参数将后两者返回给调用者。
动作:设计函数原型`double faver(int s[], int n, int *max, int *min)`,其中数组`s`和长度`n`用于计算,`max`和`min`指针用于回传结果。
double faver(int s[], int n, int *max, int *min)
{
double aver = s[0];
*max = *min = s[0]; // 初始化最大最小值
for(int i=1; i<n; i++) {
aver += s[i];
if(s[i] > *max) *max = s[i]; // 更新最大值
if(s[i] < *min) *min = s[i]; // 更新最小值
}
return aver / n; // 返回平均值
}
int main()
{
int a[5]={80,89,67,76,98}, max, min;
double aver;
aver=faver(a,5,&max,&min); // 传入数组及取址的最大最小值变量
cout<<"max="<<max<<"\n"<<"min="<<min<<endl;
cout<<"aver="<<aver<<endl;
return 0;
}
输出结果:
max=98
min=67
aver=82
返回指针的函数
除了将指针作为参数,函数也可以返回指针类型的数据。这种用法常用于返回动态分配的内存地址,或者返回指向已知数据区域(如字符串)起始位置的指针。
第1步:定义返回指针的函数格式
语法结构如下:
类型 * 函数名(形式参数表)
{
语句序列
}
注意:`类型 *`表示返回值是一个指针,其指向的具体数据类型由左侧的`类型`决定。
第2步:实战-去除字符串前导空格
目的:编写一个函数,跳过字符串开头的空格字符,返回第一个非空格字符的地址。这在解析用户输入或配置文件时非常实用。
动作:遍历指针直到不再指向空格,然后返回当前指针位置。
char * noblank(char * str)
{
while(*str == ' ')
str++; // 指针向后移动
return str; // 返回指向有效内容的指针
}
int main()
{
char *s1 = " using namespace std;", *s2;
s2 = noblank(s1); // 获取去掉前导空格的字符串地址
cout << s2 << endl;
return 0;
}
输出结果:`using namespace std;`(无前导空格)
指向函数的指针变量
C++允许定义指针变量来存储函数的入口地址,这被称为“函数指针”。利用函数指针,可以在运行时动态决定调用哪个函数,是实现回调机制和多态行为的基础。
第1步:正确声明函数指针变量
函数指针的定义语法较为特殊,必须确保括号的使用准确无误:
函数返回值类型 ( * 指针变量名 ) (形参类型表列);
关键点:( * 指针变量名 )中的括号不可省略,否则会被解析为`返回指针的函数`而非`指向函数的指针`。
第2步:使用函数指针调用函数
目的:演示如何将标准库函数`sqrt`的地址赋给指针变量,并通过指针执行计算。
动作:定义指向单参数双精度浮点数的函数指针,赋值后通过解引用调用。
// 定义指向 double(double) 函数的指针
double (*pf)( double );
pf = sqrt; // pf 现在指向 sqrt 函数
cout << (*pf)(2.0) << endl; // 通过指针调用,等价于 sqrt(2.0)
此时,`(*pf)(2.0)`与直接调用`sqrt(2.0)`完全等价。这种机制使得代码具有更高的灵活性,例如在排序算法中可以自定义比较函数并通过指针传入。
总结
掌握C++中函数与指针的结合使用,能够显著提升程序的灵活性与运行效率。通过指针参数可以实现高效的地址传递和多值返回;通过返回指针可以处理动态数据结构;而函数指针则为高级抽象和回调逻辑提供了底层支持。 以上就是C++函数与指针核心应用与实战的详细教程,更多关于C++基础语法进阶的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









