CPP学习之——函数指针(17.5)

一 概述

  • 我们知道数组名是指向数组第一个元素的常量指针,同理,函数名也是指向函数第一条指令的常量指针。
  • 一般来说,在不出现异常的情况下,程序在编译后,每个函数都有一个首地址,也就是函数第一条指令的地址,我们用一个指针来保存这个地址,那么这个指针就是函数指针,该指针可看做是函数名,因此我们可以通过该指针调用函数。

二 函数指针与函数的区别

2.1 函数指针

1
int (*func)(int);
  • 该语句声明另一个int型指针func,它指向一个函数,这个函数带有一个int型参数,并返回Int值
  • 我们要注意一点:一个指向函数的指针必须确保该函数被定义且分配了内存,否则它将指向一个空地址,这是指针的大忌
  • func指针两边的括号是必须的

2.2 指针函数

1
long *func1(int);
  • 该语句是声明一个带有整型参数的函数func1,该函数返回一个长整形指针

2.3 函数指针与指针函数的区别

1
2
long (*func1)(int);
long *func1(int);
  • 第一种是声明一个指针,该指针指向一个函数;
  • 第二种是声明一个函数,该函数返回一个指针;

三 函数实现示例

3.1 代码

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include<iostream>
#include <string>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

float triangle(float &x, float &y) {
return x * y * 0.5;
}
float rectangle(float &x, float &y) {
return x * y;
}
void swap(float &x, float &y) {
float n;
n = x;
x = y;
y = n;

}
void print(float &x, float &y) {
cout << "长为:" << x << "宽为:" << y << endl;
}
bool check(string str) {
for (int i = 0; i < str.length(); i++) {
if ((str[i] > '9' || str[i] < '0') && (str[i] != '.')) {
return false;
}
}
return true;
}
void get(float &x, float &y) {
cout << "请输入x的值:";
string str1;
cin >> str1;
while (!check(str1)) {
cout << "输入的不是数字,请重新输入!!!" << endl;
cin >> str1;
}
x = atof(str1.c_str());
cout << "请输入y的值:";
string str2;
cin >> str2;
while (!check(str2)) {
cout << "输入的不是数字,请重新输入!!!" << endl;
cin >> str2;
}
y = atof(str2.c_str());

}
int main() {

bool quit = false;
float a = 2, b = 3;
int choice;
while (quit == false) {
cout << "(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:";
cin >> choice;
switch (choice) {
case 1:
cout << "设置前长和宽的值:";
print(a, b);
get(a, b);
cout << "设置后长和宽的值:";
print(a, b);
break;
case 2:
cout << "三角形的面积为:" << triangle(a, b) << endl;
break;
case 3:
cout << "长方形的面积为:" << rectangle(a, b) << endl;
break;
case 4:
cout << "交换前长和宽的值:";
print(a, b);
swap(a, b);
cout << "交换后长和宽的值:";
print(a, b);
break;
default:
quit=true;
break;
}
}
return 0;
}

3.2 输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:1
设置前长和宽的值:长为:2宽为:3
请输入x的值:1
请输入y的值:2
设置后长和宽的值:长为:1宽为:2
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:2
三角形的面积为:1
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:3
长方形的面积为:2
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:4
交换前长和宽的值:长为:1宽为:2
交换后长和宽的值:长为:2宽为:1
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:

四 指针实现示例

4.1 代码

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include<iostream>
#include <string>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
float (*fp)(float&,float&);
void (*p)(float&,float&);

float triangle(float &x, float &y) {
return x * y * 0.5;
}
float rectangle(float &x, float &y) {
return x * y;
}
void swap(float &x, float &y) {
float n;
n = x;
x = y;
y = n;

}
void print(float &x, float &y) {
cout << "长为:" << x << "宽为:" << y << endl;
}
bool check(string str) {
for (int i = 0; i < str.length(); i++) {
if ((str[i] > '9' || str[i] < '0') && (str[i] != '.')) {
return false;
}
}
return true;
}
void get(float &x, float &y) {
cout << "请输入x的值:";
string str1;
cin >> str1;
while (!check(str1)) {
cout << "输入的不是数字,请重新输入!!!" << endl;
cin >> str1;
}
x = atof(str1.c_str());
cout << "请输入y的值:";
string str2;
cin >> str2;
while (!check(str2)) {
cout << "输入的不是数字,请重新输入!!!" << endl;
cin >> str2;
}
y = atof(str2.c_str());

}
int main() {

bool quit = false;
float a = 2, b = 3;
int choice;
while (quit == false) {
cout << "(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:";
cin >> choice;
switch (choice) {
case 1:
p=get;
break;
case 2:
cout << "三角形的面积为:";
fp=triangle;
break;
case 3:
cout << "长方形的面积为:";
fp=rectangle;
break;
case 4:
p=swap;
break;
default:
quit=true;
break;
}
if(choice==1||choice==4)
{
print(a,b);
p(a,b);
print(a,b);

}else if(choice==2||choice==3)
{
print(a,b);
cout << "面积为:"<<fp(a,b)<<endl;

}
}
return 0;
}

4.2 输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:1
长为:2宽为:3
请输入x的值:1
请输入y的值:2
长为:1宽为:2
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:2
三角形的面积为:长为:1宽为:2
面积为:1
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:3
长方形的面积为:长为:1宽为:2
面积为:2
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:4
长为:1宽为:2
长为:2宽为:1
(0)退出(1)设置长宽(2)三角形(3)退长方形(4)交换长宽:

五 补充

  • c_str:c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。标准头文件、<cstring>包含操作c-串的函数库
  • atof:atof()是C 语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,所使用的头文件为<stdlib.h>。