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

可见快速幂函数速度远快于普通幂函数

posted @ 2025-05-31 16:47  DuckingWJ  阅读(14)  评论(0)    收藏  举报