C++函数
C++函数
传递数组参数
正如C语言中学的那样,C++中的函数参数也有实参与形参之分。
在传递数组参数时,由于实际上传递的是指针,所以传递的数组实参会受函数中的形参影响。
使用const关键字对数组参数进行修饰,即可避免对实参的修改.但该技术只能对指向基本类型的指针使用,而不能对指向指针的指针使用(多维数组)
使用const修饰指针
承接上文,我们探讨使用const修饰广泛的指针
自然的,使用const修饰的指针无法修改其地址指向的值,不论其指向的变量本省是const还是非const。此时指针被称为只读指针。
只读指针可以取const或非const变量的地址,然而非const指针只可以接受非const变量
只读指针虽然不能对其所指变量进行修改,但可以直接改变其所指地址,当然改完地址之后依然不能修改所指变量。
还有另一种const修饰方法,即:
int * const p;
该方法声明的指针不可以修改地址,却可以修改其所指变量
总而言之:*p1和p2是const,而p1和*p2不是
const int *p1;//可修改地址不可修改变量
int * const p2;//可修改变量不可修改地址
函数指针
函数地址
当函数后不接括号与参数时,表示该函数的地址
声明函数指针
声明函数指针需要给出所指函数的返回值与参数列表类型,这有点像函数原型
double pam(int a){
double b;
return b;
}
double (*pf) (int);
pf=pam;
接着便可以吧(*pf)当作函数使用,C++也允许直接把pf当作函数使用。
下例展示了如何将函数指针作为参数,编写一个计算幂次函数复杂度的函数
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
// 普通乘幂函数
long long pow(long long base, long long exp, long long mod)
{
long long ans = 1;
while (exp--)
ans = ans * base % mod;
return ans;
}
// 快速幂函数
long long fastPower(long long base, long long exp, long long mod)
{
long long ans = 1;
while (exp)
{
if (exp & 1)
ans = ans * base % mod;
base = base * base % mod;
exp >>= 1;
}
return ans;
}
double Func(long long base, long long exp, long long mod, long long (*pf)(long long, long long, long long))
{
long long start = clock();
cout << pf(base, exp, mod) << " time=";
long long end = clock();
return double((end - start) * 1000) / CLOCKS_PER_SEC;
}
int main()
{
cout << "ans=" << Func(2, 1000000000, MOD, pow) << "ms" << '\n'
<< "ans=" << Func(2, 1000000000, MOD, fastPower) << "ms";
}
运行结果如下:
ans=851104391 time=3553ms
ans=851104391 time=0ms
可见快速幂函数速度远快于普通幂函数

浙公网安备 33010602011771号