学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

273

积分

0

好友

34

主题
发表于 2024-12-6 17:38:24 | 查看: 102| 回复: 0
来自:碧波

一、C++语法基础

5. 指针和引用的区别

引用不能指向空值(null),而指针可以。

引用在使用时不需要解引用操作(不需要 * 符号),而指针需要。

引用在定义时必须初始化,而指针可以在后续指向不同的对象。

6. 什么是函数指针和指针函数以及区别

函数指针 是指 指向一个函数的指针变量。它可以指向一个特定类型和签名(参数类型和返回类型)的函数。函数指针的声明形式类似于指向其他类型的指针,但其类型是指向函数的指针类型。

// 声明一个函数指针类型
typedef void (*FuncPtr)(int);  // FuncPtr 是一个指向返回类型为 void,参数为 int 的函数指针类型

// 定义一个函数
void myFunction(int x) {
    // 函数体
}

int main() {
    // 声明一个函数指针变量并初始化
    FuncPtr ptr = &myFunction;

    // 通过函数指针调用函数
    ptr(10);  // 相当于调用 myFunction(10);

    return 0;
}

指针函数 指的是 返回类型 为 指向函数的指针 的函数。换句话说,指针函数是一个返回类型为函数指针的函数。

// 声明一个指针函数
int (*funcPtr)(int, int);  // funcPtr 是一个函数,返回类型为 int*,参数为两个 int

// 定义一个函数
int add(int a, int b) {
    return a + b;
}

// 另一个函数,返回一个函数指针
int (*getAddFunctionPointer())(int, int) {
    return &add;
}

int main() {
    // 获取 add 函数的函数指针
    funcPtr = getAddFunctionPointer();

    // 通过函数指针调用函数
    int result = funcPtr(3, 4);  // 相当于调用 add(3, 4),result 等于 7

    return 0;
}

区别

函数指针是指指向函数的指针变量,而指针函数是一个返回类型为函数指针的函数。

函数指针在声明时需要指定其指向的函数的签名(参数类型和返回类型),而指针函数的返回类型是一个函数指针类型。

函数指针直接指向一个已存在的函数,可以通过该指针调用该函数;而指针函数返回一个函数指针,需要通过该函数指针再调用相应的函数。

(顺手推个岗位,技术大厂,前后端测试捞人,近三周条件放宽>>>机会

7. 什么是常量指针和指针常量以及区别

常量指针: 指的是指针本身的值(即指向的地址)可以改变,但指针指向的对象的值不能通过这个指针进行修改。

int x = 10;
int* const ptr = &x;  // ptr 是一个常量指针,指向 int 类型的对象

// 无法再修改 ptr 指向的对象,但可以修改对象本身的值
*ptr = 20;  // 合法,修改了 x 的值为 20

// 以下操作不合法,因为 ptr 是常量指针,不能改变指向
// ptr = &y;  // 错误,无法改变 ptr 的指向


指针常量:指的是指针本身的值(即指向的地址)不能改变,但可以通过这个指针修改指向对象的值

int x = 10;
const int* ptr = &x;  // ptr 是一个指向常量 int 的指针

// 以下操作合法,可以修改 ptr 所指向对象的值
x = 20;  // 修改了 x 的值为 20

// 以下操作不合法,因为 ptr 所指向的对象是常量,不能修改其值
// *ptr = 30;  // 错误,不能通过 ptr 修改其指向的对象的值

// 以下操作合法,因为 ptr 本身不是常量,可以改变其指向
int y = 50;
ptr = &y;  // 合法,修改了 ptr 的指向为变量 y


// 另一种写法 * 解引用,也是取值。

int const * p;

区别

常量指针 强调指针本身是常量,指向对象的值可以改变;

指针常量 强调指针所指向的对象是常量,指针的指向可以改变

简单记忆:

距const 修饰右边最近的值是常量 ,不能被修改。

8. 智能指针的本质是什么以及实现原理

智能指针是一种用于管理动态分配内存和自动释放资源的工具,其本质是利用了 RAII(资源获取即初始化)的设计模式。即在对象初始化的时候获取资源(比如动态分配的内存),在对象析构的时候自动释放资源。

它提供了一个封装了指针的对象,通过其析构函数来确保在对象生命周期结束时,所管理的资源能够被正确释放,避免内存泄漏和资源泄漏。

实现原理:

智能指针实现是引入计数引用机制。智能指针对象本身持有一个指向动态分配资源的指针,并维护一个引用计数。每当有一个新的智能指针指向同一块内存时,引用计数增加;当智能指针超出作用域或被显式销毁时,引用计数减少。当引用计数为零时,智能指针负责释放其管理的资源。

常见的智能指针类型:

std::shared_ptr:允许多个指针共享同一块资源,通过引用计数来管理资源的生命周期,适用于多个所有者的情况。

std::unique_ptr:独占所指向的对象,保证在任何时刻只有一个指针可以指向该对象,移动语义保证资源的所有权可以传递但不共享。

std::weak_ptr:用于协助 std::shared_ptr,不会增加引用计数,避免循环引用问题,通常用于解决 shared_ptr 的环状引用问题。

智能指针通过结合 RAII 设计模式和引用计数技术,提供了一种高效、安全、方便的动态内存管理机制,是现代 C++ 开发中推荐使用的重要工具之一。

9. weak_ptr 是否有计数方式,在那分配空间?

std::weak_ptr 是一种观测型智能指针,用于解决 std::shared_ptr 的循环引用问题,它本身并不进行内存空间分配或引用计数,而是依赖于 std::shared_ptr 来管理资源的生命周期。

std::weak_ptr 可以通过 std::lock() 成员函数获取一个 std::shared_ptr。

调用 std::lock() 成员函数可以获取一个 std::shared_ptr 对象,该对象指向 std::weak_ptr 所观测的对象(如果它仍然存在)。

如果 std::weak_ptr 过期(即其管理的对象已经被释放),std::lock() 返回一个空的 std::shared_ptr。

#include <iostream>
#include <memory>

int main() {
    std::shared_ptr<int> shared = std::make_shared<int>(42);
    std::weak_ptr<int> weak = shared;

    // 使用 std::lock() 获取 std::shared_ptr
    std::shared_ptr<int> locked = weak.lock();
    if (locked) {
        // 如果成功获取到 std::shared_ptr,则可以安全地使用它
        std::cout << "Value pointed by shared_ptr: " << *locked << std::endl;
    } else {
        std::cout << "The shared_ptr is no longer available." << std::endl;
    }

    // 在此之后,shared_ptr 可能会超出作用域,对象被销毁

    return 0;
}

10. 类型强制转换有哪几种?

有四种类型转换方式,它们分别是:

静态转换(static_cast)

常量转换(const_cast)

动态转换(dynamic_cast)

重新解释转换(reinterpret_cast)


温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-12-21 23:40 , Processed in 0.120616 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表