当前位置: 首页 > 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…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...