📜  C ++ |其他C ++ |问题7(1)

📅  最后修改于: 2023-12-03 14:59:36.579000             🧑  作者: Mango

C++ | Other C++ | 问题7


简介

本文将介绍C++中的一些其他特性,重点是问题7,其中包括函数指针、递归、结构体指针和位运算等内容。

函数指针

在C++中,函数指针是一种指向函数的指针变量。它们通常用于将函数作为参数传递给另一个函数,或者将函数作为返回值返回。示例代码如下:

#include <iostream>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    int (*p)(int, int) = add;
    std::cout << p(1, 2) << std::endl; // 输出:3

    p = subtract;
    std::cout << p(3, 2) << std::endl; // 输出:1

    return 0;
}

在上述示例中,我们定义了两个函数 addsubtract,并通过函数指针 p 分别指向它们。然后我们用 p 调用这两个函数,并分别输出了结果。

递归

递归是指在函数的定义中使用函数自身的过程。在C++中,递归可以用于解决一些特殊的问题,比如计算阶乘、斐波那契数列等。示例代码如下:

#include <iostream>

int factorial(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

int fibonacci(int n) {
    if (n == 0) {
        return 0;
    } else if (n == 1) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

int main() {
    std::cout << factorial(5) << std::endl; // 输出:120
    std::cout << fibonacci(10) << std::endl; // 输出:55

    return 0;
}

在上述示例中,我们定义了两个递归函数 factorialfibonacci,分别用于计算阶乘和斐波那契数列的值。使用递归函数时需要注意递归深度过大会导致栈溢出的风险。

结构体指针

结构体是一种组合类型,可以用于组合多个变量。在C++中,我们可以通过结构体指针来访问结构体中的变量。示例代码如下:

#include <iostream>

struct Point {
    int x;
    int y;
};

int main() {
    Point p = {1, 2};
    Point* pp = &p;
    pp->x = 3;
    pp->y = 4;

    std::cout << p.x << ", " << p.y << std::endl; // 输出:3, 4

    return 0;
}

在上述示例中,我们定义了一个结构体 Point,包含两个整型变量 xy。然后我们创建了一个结构体变量 p,并用指针 pp 指向它。最后,通过结构体指针 pp 修改了结构体变量 p 中的值,并输出了修改后的结果。

位运算

位运算是指对二进制数的位进行操作的运算。在C++中,我们可以使用一些位运算符来进行位运算操作。示例代码如下:

#include <iostream>

int main() {
    int a = 0b10101010; // 二进制表示,十进制为170
    int b = 0b01010101; // 二进制表示,十进制为85

    std::cout << std::bitset<8>(a & b) << std::endl; // 位与操作,输出:00000000
    std::cout << std::bitset<8>(a | b) << std::endl; // 位或操作,输出:11111111
    std::cout << std::bitset<8>(a ^ b) << std::endl; // 位异或操作,输出:11111111
    std::cout << std::bitset<8>(~a) << std::endl; // 取反操作,输出:01010101
    std::cout << std::bitset<8>(a << 1) << std::endl; // 左移操作,输出:01010100
    std::cout << std::bitset<8>(b >> 1) << std::endl; // 右移操作,输出:00101010

    return 0;
}

在上述示例中,我们定义了两个整型变量 ab,并用不同的位运算符对它们进行位运算操作,输出了不同的结果。其中 std::bitset<N> 是用于打印二进制数的模板类,其中N表示输出的二进制数的位数。