Part6 数组、指针与字符串 6.7指针与函数
1 以指针作为函数参数
为什么需要用指针做参数?
1 需要数据双向传递时(引用也可以达到此效果,传指针也是引用传递的一种)
2 需要传递一组数据,只传首地址运行效率比较高(实参是数组名时形参可以是指针)
//例6-10 读入三个浮点数,将整数部分和小数部分分别输出 #include<iostream> using namespace std; void splitFloat(float x, int *intPart, float *fracPart){ *intPart = static_cast<int>(x); *fracPart = x - *intPart; } 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);//指针指向的对象是常量,通过指针只能读 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 = 1; i < n; i++) cout << ", " << *(p+i); cout << "}" << endl; }
2 指针类型的函数
若函数的返回值是指针,该函数就是指针类型的函数。
//不要将非静态局部地址用作函数的返回值 //错误的例子 int main(){ int* function(); int* ptr= function(); *prt=5; //危险的访问! return 0; } int* function(){ int local=0; //非静态局部变量作用域和寿命都仅限于本函数体内 return &local; }//函数运行结束时,变量local被释
主函数中定义的数组,在子函数中对该数组元素进行某种操作后,返回其中一个元素的地址,这就是合法有效的地址
//正确的例子1,找值为0的元素的地址 #include<iostream> using namespace std; int main(){ int array[10]; int* search(int* a, int num); for(int i = 0; i < 10; i++) cin >> array[i]; int* zeroptr = search(array, 10); return 0; } int *search(int* a, int num){ for(int i = 0; i < num; i++) if(a[i] == 0) return &a[i];//返回的地址指向的元素是在主函数中定义的 }//函数运行结束时,a[i]的地址仍有
在子函数中通过动态内存分配new操作取得的内存地址返回给主函数是合法有效的
但是内存分配和释放不在同一级别,要注意不能忘记释放,避免内存泄漏
//正确的例子2 #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中的地址仍有效
3 指向函数的指针
函数指针的定义:
定义形式:
存储类型 数据类型 (*函数指针名)();
含义:
函数指针指向的是程序代码存储区的首地址。
函数指针的典型用途:实现函数回调
通过函数指针调用的函数:例如将函数的指针作为参数传递给一个函数,使得在处理相似事件的时候可以灵活的使用不同方法。
调用者不关心被调用者是谁
#include<iostream> using namespace std; int compute(int a, int b, int(*func)(int, int)){ return func(a,b); } int max(int a, int b){ return ((a > b) ? a : b); } int min(int a, int b){ return ((a < b) ? a : b); } int sum(int a, int b){ return a + b; } int main(){ int a,b,res; cout << "Enter integer a: "; cin >> a; cout << "Enter integer b: "; cin >> b; res = compute(a,b,&max); cout << "Max of " << a << " and " << b << " is " << res << endl; res = compute(a,b,&min); cout << "Min of " << a << " and " << b << " is " << res << endl; res = compute(a,b,&sum); cout << "Sum of " << a << " and " << b << " is " << res << endl; }