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;
}

 

posted @ 2017-12-05 21:17  LeoSirius  阅读(134)  评论(0编辑  收藏  举报