以指针作为函数参数
- 数据双向传递
- 只传首地址效率高为什么需要用指针做参数?
-
需要数据双向传递时(引用也可以达到此效果)
-
用指针作为函数的参数,可以使被调函数通过形参指针存取主调函数中实参指针指向的数据,实现数据的双向传递
-
需要传递一组数据,只传首地址运行效率比较高
-
实参是数组名时形参可以是指针
#include <iostream>
using namespace std;
// 例6-10 读入三个浮点数,将整数部分和小数部分分别输出
//将实数x分成整数部分和小叔部分,形参intpart、fracpart是指针
void splitFloat(float x, int *intPart, float *fracPart){
*intPart = static_cast<int>(x);//取x的整数部分
*fracPart = x - *intPart;//取x的小数部分
};
int main() {
cout << "Enter 3 float point numbers:" << endl;
for (int i =0;i<3;i++){
float x,f;
int n;
cin >> x;
splitFloat(x,&n,&f);//变量地址作为实参
cout << "Integer Part = " << n << " Fraction Part = " << f << endl;
}
return 0;
}
指向常量的指针做形参
#include <iostream>
using namespace std;
const int N = 6;
void print (const int *p,int n);//不能通过p1改变所指的对象
//指向常量的指针做形参
int main() {
int array[N];
for(int i =0;i<N;i++)
cin >> array[i];
print(array,N);
return 0;
};
void print(const int *p,int n){
cout << "{" << *p;
for (int i=0;i<n;i++)
cout << ", "<< *(p+i);
cout << "}" << endl;
};
指针类型的函数(函数返回值是指针)
不要将非静态局部地址用作函数的返回值
new—delete 动态内存分配 注意释放 避免内存泄漏
#include<iostream>
using namespace std;
int main(){
int* newintvar(); //指针类型的函数
int* intptr= newintvar();
*intptr=5; //访问的是合法有效的地址
delete intptr; //如果忘记在这里释放,会造成内存泄漏
return 0;
}
int* newintvar (){
int* p=new int();
return p; //返回的地址指向的是动态分配的空间
}//函数运行结束时,p中的地址仍有效
指向函数的指针
函数指针的典型用途——实现函数回调
- 例如将函数的指针作为参数传递给一个函数,使得在处理相似事件的时候可以灵 活的使用不同的方法。
- 需知道存在一个具有特定原型和限制条件的被调用函数。
函数指针举例
- 编写一个计算函数compute,对两个整数进行各种计算。有一个形参为指向具体算 法函数的指针,根据不同的实参函数,用不同的算法进行计算
- 编写三个函数:求两个整数的最大值、最小值、和。分别用这三个函数作为实参,测 试compute函数