一、指针变量作为函数参数传递
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; } |
三、函数指针和函数指针数组
程序中不仅数据是存放在内存空间中,代码也同样存放在内存空间里。具体讲,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; //函数地址 } |
函数指针的基本操作有 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; } |
函数指针数组
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; } |