指针与函数

一、指针变量作为函数参数传递

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;

void swap(int *x,int *y){
        int t=*x;
        *x=*y;
        *y=t;
}

int main(){
   int a=2,b=3;
       swap(&a,&b);
        cout<<a<<' '<<b;

    return 0;
}

习题:编写一个函数,将三个整型变量排序,并将三者中的最小值赋给第一个变量,次小 值赋给第二个变量,最大值赋给第三个变量。 answer

二、函数返回指针

一个函数可以返回整数值、字符值、实型值等,也可以返回指针联系的数据(即地址)。 返回指针值的函数的一般定义形式为:
类型名 * 函数名(参数列表);
例如:
int *a(int a,int b)
a 是函数名,调用它后得到一个指向整型数据的指针(地址)。x 和 y 是函数 a 的形参,为整型。
注意:在*a 的两侧没有括号;在 a 的两侧分别为*运算符和()运算符,由于()的优先级高于*,因此 a 先于()结合。在函数前面有一个*,表示此函数是返回指针类型的函数。 最前面的 int 表示返回的指针指向整型变量。对初学 C++语言的人来说,这种定义形式可能 不太习惯,容易弄错,用时要十分小心。

题目:编写一个函数,用于在一个包含 N 个整数的数组中找到第一个质数,若有则返回 函数的地址;否则返回 NULL(空指针)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<cmath>
#include<iostream>
using namespace std;
int n,a[10001];
bool isprime(int n)
{
     if (n<2) return false; 
     if (n==2) return true;
//判断 n 是不是素数
    for (int i=2; i<=sqrt(n); ++i) 
     {
         if (n%i==0)
        return false;
     }
    return true;
}

int* find(){
for (int i=1; i<=n; ++i) 
        if (isprime(a[i]))
        return &a[i];
     return NULL;
}

int main() {
    cin>>n; 
    for (int i=1; i<=n; ++i)
     cin>>a[i]; 
     int *p=find();
    if (p!=NULL)  cout<<*p; 
    else printf("can't find!"); 
    return 0;
}

edit & run

三、函数指针和函数指针数组

程序中不仅数据是存放在内存空间中,代码也同样存放在内存空间里。具体讲,C++的函数也保存在内存中,函数的入口地址也同样可以用指针访问 。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <iostream>
using namespace std;
int test(int a){
    return a;
};
int main(){
    int (*p)(int);  //定义了一个函数指针变量p
    p=test;          //装函数test的地址赋值给p
    cout<<(*p)(5)<<endl;    //使用p来调用函数的两种方式
    cout<<p(10)<<endl;      
    cout<<(void *)p<<endl;   //函数地址
    cout<<(void *)test<<endl;  //函数地址
    }

edit & run

函数指针的基本操作有 3 个:
(1)声明函数指针。
声明要指定函数的返回类型以及函数的参数列表,和函数原型差不多。
例如,函数的原型是:int test(int);
相应的指针声明就是:int (*fp)(int);
要注意的是,不能写成:int *fp(int);
这样计算机编译程序会处理成声明一个 fp(int)的函数,返回类型是 int* 。
(2)获取函数的地址。
获取函数的地址很简单,只要使用函数名即可,例如,fp=test;
这表明函数名和数组名一样,可以看作是指针。
(3)使用函数指针来调用函数。
类似普通变量指针,可以用(*fp)来间接调用指向的函数。但 C++也允许像使用函数名一样使用 fp,虽然有争议,但 C++确实是支持了。
函数指针还有另一种结合 typedef 的声明方式

使用typedef定义函数指针示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <iostream>
using namespace std;
int add(int a,int b){
    return a+b;
}
typedef int (*addP)(int,int); //自定义一个函数指针变量类型addP;
int main(){
   addP fp=add;               //定义了一个addP类型的函数指针fp,并赋值为add; 
   cout<<fp(2,5)<<endl;
   }

edit & run

函数指针数组

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>
using namespace std;
void t1(){cout<<"test1";}
void t2(){cout<<"test2";}
void t3(){cout<<"test3";}
void t4(){cout<<"test4";}
typedef void (*p)();   //定义了一个函数指针变量类型p
int main (){
    p menu[]={t1,t2,t3,t4};    //定义了一个p类型的函数 指针数组menu,并初始化。
    int select;
    cout<<"please input a number:";
    cin>>select;
    menu[select]();
    return 0;
}

edit & run

Scroll to Top