当前位置: 首页 > news >正文

【C/C++】语言基础知识总复习

文章目录

  • 1. 指针
    • 1.1 数组和指针
    • 1.2 函数指针
    • 1.3 const 和 指针、static、#define、typedef
    • 1.4 指针和引用的异同
    • 1.5 sizeof与strlen
  • 2. 库函数及其模拟实现
  • 3. 自定义类型
  • 4. 数据存储
  • 5. 编译链接过程
  • 6. C++入门基础
    • 6.1 函数重载
    • 6.2 引用和指针
    • 6.3 建议使用const、inline、enum去替代宏
    • 6.4 nullptr的意义是什么?
  • 7. 类和对象
    • 7.1 面向对象和面向过程的区别?
    • 7.2 类大小的计算
    • 7.3 class和struct区别
    • 7.4 C++11智能指针
    • 7.5 this指针
    • 7.6 八个默认成员函数
    • 7.7 运算符重载
    • 7.8 友元
    • 7.9 static 成员
  • 8. 内存管理

1. 指针

1.1 数组和指针

数组指针是指针,指向数组的第一个元素;

#include <stdio.h>int main() {int arr[3] = {1, 2, 3};int (*ptr)[3] = &arr;  // ptr 是一个指向包含3个整数的数组的指针// 通过指针访问数组元素for (int i = 0; i < 3; i++) {printf("%d ", (*ptr)[i]);}printf("\n");return 0;
}

指针数组是数组,数组的每个对象都是一个指针;

#include <stdio.h>int main() {int a = 10, b = 20, c = 30;int *ptr_arr[3];  // ptr_arr 是一个包含3个整数指针的数组ptr_arr[0] = &a;ptr_arr[1] = &b;ptr_arr[2] = &c;// 通过指针数组访问整数变量for (int i = 0; i < 3; i++) {printf("%d ", *ptr_arr[i]);}printf("\n");return 0;
}

1.2 函数指针

函数指针是一个指针,它指向一个函数的地址。函数指针允许我们通过指针允许我们通过指针来调用函数,这在实现回调函数调用时非常有用,虚函数表也就时一个函数指针数组。

#include <stdio.h>// 定义一个函数类型
typedef int (*FuncPtr)(int, int);// 定义一个函数
int add(int a, int b) {return a + b;
}// 另一个函数
int subtract(int a, int b) {return a - b;
}// 使用函数指针的函数
void useFunctionPointer(FuncPtr fp, int x, int y) {int result = fp(x, y);printf("Result: %d\n", result);
}int main() {FuncPtr fp;// 指向 add 函数fp = add;useFunctionPointer(fp, 5, 3);  // 输出: Result: 8// 指向 subtract 函数fp = subtract;useFunctionPointer(fp, 5, 3);  // 输出: Result: 2return 0;
}

指针函数是一个返回指针的函数,函数的返回类型是指针。

#include <stdio.h>
#include <stdlib.h>// 函数返回一个指向整数的指针
int* createArray(int size) {int* array = (int*)malloc(size * sizeof(int)); // 动态分配内存if (array == NULL) {printf("Memory allocation failed\n");exit(1);}// 初始化数组for (int i = 0; i < size; i++) {array[i] = i + 1;}return array;
}int main() {int size = 5;int* arr = createArray(size);// 打印数组内容for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");// 释放分配的内存free(arr);return 0;
}

1.3 const 和 指针、static、#define、typedef

  • const:定义变量不能修改,必须在定义时初始化;在 * 前是常量指针(不能通过该指针修改),在*后是指针常量(不能再指向其它地址)修饰函数的参数(函数体内不能修改这个值)
  • #define: C语言中定义语法,是预处理指令(简单的替换)、没有作用域
  • typedef:有类型检查功能,在定义很长类型的时候方便的多、有作用域
  • #defineconst都能定义常量,define可替换常量、表达式(代码段中:不分配内存空间);const常量在(数据段中)分配空间
#include <stdio.h>
// 加法宏函数
#define ADD(x, y) ((x) + (y))
// 减法宏函数
#define SUBTRACT(x, y) ((x) - (y))
int main() {int a = 5;int b = 3;printf("Addition: %d + %d = %d\n", a, b, ADD(a, b));        // 输出: 5 + 3 = 8printf("Subtraction: %d - %d = %d\n", a, b, SUBTRACT(a, b)); // 输出: 5 - 3 = 2return 0;
}

1.4 指针和引用的异同

  • 相同:都是地址概念;
  • 区别:指针是实体、引用是别名;指针++是内存地址自增、引用时值自增;引用无需解引用(*)、指针需要解引用、引用只能在定义的时候被初始化、引用不能为空。

1.5 sizeof与strlen

https://qhd666.blog.csdn.net/article/details/132915168

  • sizeof 用于计算数据类型或变量的大小(以字节为单位),它可以用于基本数据类型、数组、结构体、联合体以及其他类型。
  • strlen 计算以null终止字符的长度(不包括null终止符),它在 string.h 头文件中定义。
  • 数组所占空间:sizeof(数组名); 数组大小:sizeof(数组名)/sizeof(数据类型);

2. 库函数及其模拟实现

https://qhd666.blog.csdn.net/article/details/133102559
memcpy 用于不重叠的内存区域快速复制数据,而 memmove 用于处理可能重叠的内存区域,确保数据正确移动。
字符串拷贝:strcpystrncpy
字符创连结:strcatstrncat
字符串比较:memcmpstrcmpstrncmp
字符串查找:strstr
计算长度:strlen

3. 自定义类型

内存对齐:自定义类型的内存对齐是确保数据在内存中按照特定字节边界排列,以提高访问效率和满足硬件要求。
https://qhd666.blog.csdn.net/article/details/134456752?spm=1001.2014.3001.5502

https://qhd666.blog.csdn.net/article/details/132009604?spm=1001.2014.3001.5502

  • 内存对齐的规则:
  1. 第一个成员在与结构体变量偏移量为0的位置
  2. 其他成员变量要对齐到对齐数的整数倍位置
  3. 对齐数 = min( 编译器默认的对齐数 , 该成员变量大小 ) , VS下默认对齐数为8
  4. 结构体总大小为每一个成员变量的最大对齐数的整数倍
  5. 修改默认对齐数的方法: #pragma pack(8) , 设置默认对齐数为8
  • 为什么要有内存对齐
  1. 为了平台的可移植:不是所有的硬件都能访问任意地址上的任意数据, 可能只能在4的倍数的地址处取数据。
  2. 为了性能:若内存不对齐, 原本只需要访问一次的数据现在可能要访问两次才能拿全
  • 整型的存储:
  • 原码:直接表示整数的符号和大小,最高位为符号位。
  • 反码:正数与原码相同,负数的表示是将原码的每一位取反。
  • 补码:正数与原码相同,负数的表示是将反码加1,主要用于简化计算和处理负数。

4. 数据存储

https://qhd666.blog.csdn.net/article/details/132009604
静态存储区(全局变量、静态变量)、栈区(局部变量、函数内参数)。

大端:高地址存低字节、低地址存高字节
小端:高地址存高字节、低地址存低字节

5. 编译链接过程

编译:将源代码翻译成目标代码(机器语言),生成一个或多个目标文件。
汇编:将汇编代码转换成目标代码(如果需要)。
链接:将多个目标文件和库文件合并,解决符号引用,生成最终的可执行文件。

6. C++入门基础

6.1 函数重载

https://qhd666.blog.csdn.net/article/details/140560876
函数重载是指在同一作用域内,多个函数名相同但参数列表不同的特性。

6.2 引用和指针

https://qhd666.blog.csdn.net/article/details/140904531?spm=1001.2014.3001.5502

  • 指针和引用的异同:

相同:都是地址概念;
区别:指针是实体、引用是别名、指针++是内存地址自增、引用时值自增、引用无需解引用(*)、指针需要解引用、引用只能在定义的时候被初始化一次、引用不能为空。

  • 引用价值:做参数和做返回值

引用可以作为参数传递给函数以避免复制开销,也可以作为返回值以允许函数返回对对象的直接引用。

例如:

int& getElement(std::vector<int>& vec, size_t index) {return vec[index]; // 返回对 vec 中元素的引用
}
  • 引用也不是绝对安全的:

悬挂引用:如果引用的对象在引用被使用之前已经被销毁或超出作用域(例如局部变量),那么引用将变成悬挂引用,导致未定义行为。

int* unsafeFunc() {int local = 42;return &local; // local 在函数返回后被销毁
}
// 访问 unsafeFunc() 返回的指针将是未定义行为

6.3 建议使用const、inline、enum去替代宏

  • 宏的缺点:
  1. 调试困难:宏展开后,调试时无法直接查看宏的原始代码。
  2. 类型安全差:宏不进行类型检查,容易导致类型错误。
  3. 作用域问题:宏没有作用域限制,可能影响其他代码。
  4. 代码重复:宏可能导致重复代码,增加维护难度。
  5. 可能导致错误:宏展开中的括号问题可能引发难以发现的错误。
  • inline要求:频繁调用短小函数合适(给编译器提建议)

6.4 nullptr的意义是什么?

在C++中 #define NULL 0
NULL定义存在缺陷

nullptr 是 C++11 引入的类型安全关键字,用于表示空指针,而 NULL 是一个宏定义,通常与 0等价,可能在类型安全和可移植性方面不如 nullptr

7. 类和对象

7.1 面向对象和面向过程的区别?

面向对象侧重于对象的抽象和封装,而面向过程则着重于步骤和函数的顺序执行。

7.2 类大小的计算

  • 内存对齐

  • 空类

7.3 class和struct区别

7.4 C++11智能指针

https://qhd666.blog.csdn.net/article/details/139183793
unique_ptr 禁止拷贝、shared_ptr使用引用计数:解决多次释放问题、每一个资源配一个引用计数

7.5 this指针

是每个对象的专属指针,访问自己的数据成员和方法。

  • this 指针存在哪里?
    this 指针在类的成员函数中,指向当前对象的内存地址。它通常存储在栈上或寄存器中。
  • this 指针可以为空吗?
    this 指针不会为空,因为它总是指向当前对象。

7.6 八个默认成员函数

  • 构造和析构

  • 拷贝构造和赋值

  • 移动构造和移动赋值

  • 初始化列表

  • 特性是什么?
    以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
  • 哪些成员必须在初始化列表初始化?
    引用成员变量
    const成员变量
    自定义类型成员(且该类没有默认构造函数时)
  • 初始化顺序是按声明顺序
  1. 什么情况下要自己写?
    一般构造都要自己写:
    深拷贝的类,一般都要自己写析构、拷贝、构造、赋值。
    深拷贝的类,也需要实现移动构造和移动赋值
  2. 默认生成的这些函数行为是什么?
  1. 默认构造函数:初始化对象的成员。
  2. 复制构造函数:逐个复制对象的成员。
  3. 赋值运算符:将右侧对象的成员赋值给左侧对象。
  4. 析构函数:释放对象占用的资源。
  5. 移动构造函数:移动资源,清空右侧对象。
  6. 移动赋值运算符:移动资源并清空右侧对象。

这些行为适用于所有类,除非你自定义了这些函数。

  1. 什么是默认构造?(不传参的都可以是默认构造)

我们不写,编译器默认生成的是默认构造。
全缺省的是默认构造 。
没有参数的是默认构造。

7.7 运算符重载

  1. 哪些运算符不能重载?
  2. 和函数重载的区别?
  3. 他的意义是什么?

7.8 友元

  1. 友元函数
  2. 友元类

7.9 static 成员

static成员就是全局成员不占类的大小,仅仅只是收到类域限制而已

8. 内存管理

-------------------------------------未完待续----------------------------------------------------

相关文章:

【C/C++】语言基础知识总复习

文章目录 1. 指针1.1 数组和指针1.2 函数指针1.3 const 和 指针、static、#define、typedef1.4 指针和引用的异同1.5 sizeof与strlen 2. 库函数及其模拟实现3. 自定义类型4. 数据存储5. 编译链接过程6. C入门基础6.1 函数重载6.2 引用和指针6.3 建议使用const、inline、enum去替…...

【漏洞修复】Tomcat中间件漏洞

1.CVE-2017-12615 抓包上传一句话木马 密码passwd 2.后台弱口令部署war包 先用弱口令登录网站后台 制作war包 将172.jsp压缩成.zip文件&#xff0c;修改后缀为.war 上传 蚁剑链接 3.CVE-2020-1938 Python2 CVE-2020-1938.py IP -p 端口 -f 要读取的文件 漏洞修复&#xf…...

10.动态路由绑定怎么做

为什么要动态路由绑定 因为,如果我们的导航栏没有这个权限,输入对应网址,一样可以获取对应的页面,为了解决这个问题,有两种解决方案,一种是动态路由绑定(导航有多少个,就有多少个路由,在路由修改之前,先进行一个导航路由的加载和路由的动态绑定,然后看是否有这个路由,有就跳转…...

操作ArkTS页面跳转及路由相关心得

本文为JS老狗原创。 当前端不得不关注的点&#xff1a;路由&#xff0c;今天聊一聊鸿蒙相关的一点心得。 总体上套路不意外&#xff0c;基本就是&#xff08;尤其是Web&#xff09;前端那些事&#xff1a;维护路由表、跳转带参数、历史堆栈操作&#xff0c;等等。 历史原因&…...

Vue2-低版本编译兼容-基础语法-data-methods-双向数据绑定v-model

文章目录 1.安装编译命令2.低版本兼容3.vue2响应式数据3.1.data定义3.2.双向数据绑定v-model3.3.单向数据绑定v-bind4.方法methods5.子组件向父组件传值6.父组件向子组件传值1.安装编译命令 命令行工具 vue create zhiliaoplugins8824barcodebatch cd zhiliaoplugins8824barc…...

提取“c语言的函数定义“脚本

------------------------------------------------------------ author: hjjdebug date: 2024年 08月 11日 星期日 16:35:31 CST description: 提取c语言的函数定义脚本 ------------------------------------------------------------ c 文件中包含很多函数定义, 我想在每…...

pytorch学习(十二):对现有的模型进行修改

以VGG16为例&#xff1a; VGG((features): Sequential((0): Conv2d(3, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(1): ReLU(inplaceTrue)(2): Conv2d(64, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(3): ReLU(inplaceTrue)(4): MaxPool2d(kernel_size2…...

服务器虚拟内存是什么?虚拟内存怎么设置?

服务器虚拟内存是计算机系统内存管理的一种重要技术&#xff0c;它允许应用程序认为它们拥有连续且完整的内存地址空间&#xff0c;而实际上这些内存空间是由多个物理内存碎片和外部磁盘存储器上的空间共同组成的。当物理内存&#xff08;RAM&#xff09;不足时&#xff0c;系统…...

深度学习入门指南(1) - 从chatgpt入手

2012年&#xff0c;加拿大多伦多大学的Hinton教授带领他的两个学生Alex和Ilya一起用AlexNet撞开了深度学习的大门&#xff0c;从此人类走入了深度学习时代。 2015年&#xff0c;这个第二作者80后Ilya Sutskever参与创建了openai公司。现在Ilya是openai的首席科学家&#xff0c;…...

Python学习笔记(六)

""" 演示对序列进行切片操作 """ # 切片&#xff1b;从一个序列中&#xff0c;取出一个子序列 # 语法[起始下标&#xff1a;结束下标&#xff1a;步长] # 这三个都不写也行&#xff0c;视为从头到尾步长为1 # 起始下标不写&#xff0c;视作从头开…...

大数据安全规划总体方案(45页PPT)

方案介绍&#xff1a; 大数据安全规划总体方案的制定&#xff0c;旨在应对当前大数据环境中存在的各类安全风险&#xff0c;包括但不限于数据泄露、数据篡改、非法访问等。通过构建完善的安全防护体系&#xff0c;保障大数据在采集、存储、处理、传输、共享等全生命周期中的安…...

第20周:Pytorch文本分类入门

目录 前言 一、前期准备 1.1 环境安装导入包 1.2 加载数据 1.3 构建词典 1.4 生成数据批次和迭代器 二、准备模型 2.1 定义模型 2.2 定义示例 2.3 定义训练函数与评估函数 三、训练模型 3.1 拆分数据集并运行模型 3.2 使用测试数据集评估模型 总结 前言 &#x1…...

记一次 SpringBoot2.x 配置 Fastjson请求报 internal server 500

1.遇到的问题 报错springboot从2.1.16升级到2.5.15&#xff0c;之后就报500内部错误&#xff0c;后面调用都是正常的&#xff0c;就考虑转换有错。 接口返回错误&#xff1a; 2.解决办法 因为我用了fastjson&#xff0c;需要转换下&#xff0c;目前可能理解就是springboot-we…...

OSPF笔记

OSPF&#xff1a;开放式最短路径优先协议 使用范围&#xff1a;IGP 协议算法特点&#xff1a;链路状态型路由协议&#xff0c;SPF算法 协议是否传递网络掩码&#xff1a;传递网络掩码 协议封装&#xff1a;基于ip协议封装&#xff0c;协议号为89 一&#xff0c;ospf特点 1…...

IOC容器初始化流程

IOC容器初始化流程 一、概要1.准备上下文prepareRefresh()2. 获取beanFactory:obtainFreshBeanFactory()3. 准备beanFactory:prepareBeanFactory(beanFactory)4. 后置处理:postProcessBeanFactory()5. 调用bean工厂后置处理器:invokeBeanFactoryPostProcessors()6. 注册bea…...

第二季度云计算市场份额榜单:微软下滑,谷歌上升,AWS仍保持领先

2024 年第二季度&#xff0c;随着企业云支出达到 790 亿美元的新高&#xff0c;三大云计算巨头微软、谷歌云和 AWS的全球云市场份额发生了变化。 根据新的市场数据&#xff0c;以下是 2024 年第二季度全球云市场份额结果和六大世界领先者&#xff0c;其中包括 AWS、阿里巴巴、…...

三点确定圆心算法推导

已知a,b,c三点求过这三点的圆心坐标 a ( x 1 , y 1 ) a(x_1, y_1) a(x1​,y1​) 、 b ( x 2 , y 2 ) b(x_2, y_2) b(x2​,y2​) 、 c ( x 3 , y 3 ) c(x_3, y_3) c(x3​,y3​) 确认三点是否共线 叉积计算方式 v → ( X 1 , Y 1 ) u → ( X 2 , Y 2 ) X 1 Y 2 − X 2 Y 1 \…...

神经网络 (NN) TensorFlow Playground在线应用程序

神经网络 (NN) 历史上最重要的发现之一是神经网络 (NN) 的强大功能。 在神经网络中&#xff0c;称为神经元的许多数据层被添加在一起或相互堆叠以计算新的数据级别。 常用的简称&#xff1a; DNN 深度神经网络CNN 卷积神经网络RNN 循环神经网络 神经元 科学家一致认为&am…...

腾讯课堂 离线m3u8.sqlite转成视频

为了广大腾讯课堂用户对于购买的课程不能正常离线播放&#xff0c;构成知识付费损失&#xff0c;故出此文档。 重点&#xff1a;完全免费&#xff01;&#xff01;&#xff01;完全免费&#xff01;&#xff01;&#xff01;完全免费&#xff01;&#xff01;&#xff01; 怎么…...

Linux多路转接

文章目录 IO模型多路转接select 和 pollepoll IO模型 在还在学习语言的阶段&#xff0c;C里使用cin&#xff0c;或者是C使用scanf的时候&#xff0c;总是要等着我们输入数据才执行&#xff0c;这种IO是阻塞IO。下面是比较正式的说法。 阻塞IO: 在内核将数据准备好之前&#xf…...

IDEA导入Maven项目的流程配置以常见问题解决

1. 前言 本文主要围绕着在IDEA中导入新Maven项目后的配置及常见问题解决来展开说说。相关的部分软件如下&#xff1a; IntelliJ IDEA 2021.1JDK 1.8Window 2. 导入Maven项目及配置 2.1 导入Maven项目 下面介绍了直接打开本地项目和导入git上的项目两种导入Maven方式。 1…...

【数据分析---- Pandas进阶指南:核心计算方法、缺失值处理及数据类型管理】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索数据分析&#xff0c;本篇文章主要讲述了&#xff1a;Pandas进阶指南&#xff1a;核心计算方法、缺失值处理及数据类型管理等等。欢迎大家一起探索讨论&#x…...

2024世界机器人大会将于8月21日至25日在京举行

2024年的世界机器人大会预定于8月21日至25日&#xff0c;在北京经济技术开发区的北人亦创国际会展中心隆重举办。 本届大会以“共育新质生产力 共享智能新未来”为核心主题&#xff0c;将汇聚来自全球超过300位的机器人行业专家、国际组织代表、杰出科学家以及企业家&#xff0…...

【Linux】lvm被删除或者lvm丢失了怎么办

模拟案例 接下来模拟lvm误删除如何恢复的案例&#xff1a; 模拟删除&#xff1a; 查看vg名&#xff1a; vgdisplayvgcfgrestore --list uniontechos #查看之前的操作 例如我删除的&#xff0c;现场没有删除就用最近的操作文件&#xff1a; 还原&#xff1a; vgcfgrestore…...

疫情防控管理系统

摘 要 由于当前疫情防控形势复杂&#xff0c;为做好学校疫情防控管理措施&#xff0c;根据上级防疫部门要求&#xff0c;为了学生的生命安全&#xff0c;要求学校加强疫情防控的管理。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#x…...

永久删除的Android 文件去哪了?在Android上恢复误删除的消息和照片方法?

丢失重要消息和照片可能是一种令人沮丧的经历&#xff0c;尤其是在您没有备份的情况下。但别担心&#xff0c;在本教程中&#xff0c;我们将指导您完成在Android设备上恢复已删除消息和照片的步骤。无论您是不小心删除了它们还是由于软件问题而消失了&#xff0c;这些步骤都可以…...

宠物服务小程序多生态转化

宠物服务如美容造型、医疗、看护寄养等有着不少需求&#xff0c;尤其是年轻人从宠物生活到饮食起居等面面俱到&#xff0c;往往不惜金钱给到较好的环境&#xff0c;如定时除虫、优质食物、玩具、检查身体、服饰&#xff1b; 近些年宠物服务店新开数量也较多&#xff0c;同行竞…...

今天细说一下工业制造行业MES系统

文章目录 前言什么是MES&#xff1f; 前言 最近几个月在做制造行业的MES系统开发&#xff0c;这类面向制造业的系统是今年做的第三个系统了&#xff0c;也算是了解较深的了&#xff0c;和一个之前转行做这一块的朋友聊了聊&#xff0c;他们集团要扩大规模&#xff0c;准备招ME…...

C++ 知识点(长期更新)

C++ 知识点 C/C++1. `cin`, `cin.get()`, `getchar()`, `getline()`, 和 `cin.getline()`的区别。2. 有关 cin >>3. 定义和声明的区别4. `union`、`struct`和`class`的区别5. 深拷贝 vs 浅拷贝6. new 和 malloc 的区别7. 被free回收的内存是立即返还给操作系统吗?为什么…...

Spring AI + 通义千问 入门学习

Spring AI 通义千问 入门学习 文章目录 Spring AI 通义千问 入门学习一&#xff0c;开发环境配置二&#xff0c;项目搭建2.1 pom文件2.2 配置文件 三&#xff0c;AI使用3.1 对话问答3.1.1 普通方式3.1.2 流方式 3.2 文字生成图片 最近AI很火&#xff0c;而Spring也出了Spring…...