C++学习路线(十六)
void类型指针
void -> 空类型
void* -> 空类型指针,只存储地址的值,丢失类型,无法访问,要访问里面的值
我们必须对指针进行正确的类型转换,然后再间接引用指针
所有其它类型的指针都可以隐式自动转换成 void 类型指针,反之需要强制转换。
int arr[] = { 1, 2, 3, 4, 5 };
char ch = 'a';
void* ptr = arr;
printf("0x%p\n", ptr);
printf("%d\n", *(int*)ptr);
而且 void*指针 不允许算术运算
常见错误总结
1.使用未初始化指针
这里面去描述两种场景说明使用未初始化指针的场景
第一种场景 未初始化就使用
int x, * p;
x = 10;
printf("%p\n", p);
p = &x;
第二种场景 比较常见
void func(int* p) {
static int count = 50;
p = &count;
}int main() {
int x, * p;
func(p);
cout << "p = " << p << endl;
}
怎么解决上面的问题 之前的笔记有提到过 使用二级指针
#include <iostream>
using namespace std;void func(int** p) {static int count = 50;*p = &count;
}int main() {int x, * p;func(&p);cout << "p = " << p << endl;
}
2.将值当作地址赋值给指针
怎么解决
1)*p = x;
2)p = &x;
3.忘记解引直接访问内存
char input[64] = { 'h', 'e', 'l', 'l', 'o' };
char* p1, * p2;
p1 = &input[0];
p2 = &input[1];
if (p1 > p2) {cout << "p1 is greater than p2" << endl;
}
else {cout << "p2 is greater than p1" << endl;
}
return 0;
这种情况下 会打印 "p2 is greater than p1"
#include <iostream>
using namespace std;int main() {char input[64] = { 'h', 'e', 'l', 'l', 'o' };char* p1, * p2;p1 = &input[0];p2 = &input[1];if (*p1 > *p2) {cout << "p1 is greater than p2" << endl;}else {cout << "p2 is greater than p1" << endl;}return 0;
}
4.常见的错误4:再次使用忽略重新赋初值
#include <iostream>
#include <string>
using namespace std;int main() {char input[64];char* p1 = input;do {gets_s(input, 64);while (*p1 != '\0') printf("%c", *p1++);} while (strcmp(input, "exit") != 0);return 0;
}
这种只能打印第一个数字 因为p1没有被重新赋值给input
正确的做法是
#include <iostream>
#include <string>
using namespace std;int main() {char input[64];char* p1;do {printf("Enter a string: ");gets_s(input, 64);p1 = input;while (*p1 != '\0') printf("%c", *p1++);printf("\n");} while (strcmp(input, "exit") != 0);return 0;
}
常量引用
在C++中可以声明const引用
语法:const Type&name = var;
const引用让变量拥有只读属性
分两种情况: |
1.用变量初始化常引用 |
2.用字面量初始化常量引用 |
// 使用变量初始化常量引用
int a = 10;
const int& b = a;
// 用字面量初始化常量引用
const int& c = 20;//会给引用分配内存空间
函数指针
我们来探究一下 函数有没有指针
#include <iostream>
#include <string>
using namespace std;int compare_int(const void* a, const void* b) {int* pa = (int*)a;int* pb = (int*)b;cout << "pa地址:" << &pa << endl;cout << "pb地址:" << &pb << endl;return *pa - *pb;
}int main() {// 函数有没有地址?cout << "compare_int: " << &compare_int << endl;int x = 10, y = 20;compare_int(&x, &y);return 0;
}
函数指针的定义
#include <iostream>
#include <string>
using namespace std;int compare_int(const void* a, const void* b) {int* pa = (int*)a;int* pb = (int*)b;cout << "pa地址:" << &pa << endl;cout << "pb地址:" << &pb << endl;return *pa - *pb;
}int main() {// 函数有没有地址?int(*ptr)(const void*, const void*) = &compare_int;int x = 10, y = 20;//函数指针有两种调用方式//1.解引用方式调用(*ptr)(&x, &y);//2.直接调用ptr(&x, &y);return 0;
}
上面这个是函数指针和void*指针的应用
#include <iostream>
#include <string>
using namespace std;int compare_int(const void* a, const void* b) {int* pa = (int*)a;int* pb = (int*)b;return *pa - *pb;
}int main() {// 函数有没有地址?int arr[12] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10, 11, 12 };int(*ptr)(const void*, const void*) = &compare_int;int x = 10, y = 20;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), ptr);cout << "After sorting: ";for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {cout << arr[i] << " ";}return 0;
}
qsort也可以对char数组进行排序
#include <iostream>
#include <string>
using namespace std;int compare_int(const void* a, const void* b) {int* pa = (int*)a;int* pb = (int*)b;return *pa - *pb;
}int compare_char(const void* a, const void* b) {char* pa = (char*)a;char* pb = (char*)b;return *pa - *pb;
}int main() {// 函数有没有地址?char charArray[] = "asodifoadfjdvn";int(*pCompare)(const void*, const void*) = &compare_char;qsort(charArray, sizeof(charArray) / sizeof(char), sizeof(char), pCompare);for (int i = 0; i < sizeof(charArray) / sizeof(char); i++) {cout << charArray[i];}return 0;
}
相关文章:

C++学习路线(十六)
void类型指针 void -> 空类型 void* -> 空类型指针,只存储地址的值,丢失类型,无法访问,要访问里面的值 我们必须对指针进行正确的类型转换,然后再间接引用指针 所有其它类型的指针都可以隐式自动转换成 void 类型…...

2024年最受欢迎的AI工具与实际应用:AI技术对未来生活的深远影响
2024年最受欢迎的AI工具与实际应用:AI技术对未来生活的深远影响 随着2024年的到来,人工智能(AI)技术已经深入渗透到我们生活的方方面面。从日常工作到科学研究,AI工具的应用变得越来越广泛。无论是生成式AI工具&#…...

【网络安全】账户安全随笔
未经许可,不得转载。 作者:Enoch 原文出处:https://mp.weixin.qq.com/s/oKBpZ0F6Kl5NNmHSYCYIPw 文章目录 账户类型资金划转问题幂等ID使用错误多接口并发问题精度问题其他划转问题特殊资金盗取问题科学计数法问题账户类型 在互联网金融和电商企业中,账户安全直接关系到用…...

在线培训知识库管理系统:教育行业的新动力
在当今数字化时代,教育行业正经历着前所未有的变革。随着在线教育的兴起,如何高效地管理和传播知识成为了一个关键问题。在线培训知识库管理系统应运而生,它以其强大的知识整合、分享和管理能力,为教育行业注入了新的活力。 一、…...

【AI声音克隆本地整合包及教程】第二代GPT-SoVITS V2:声音克隆的新境界
在数字时代的浪潮中,个性化和创新是永恒的主题。GPT-SoVITS V2,作为第二代声音克隆技术,正以其革命性的特性和应用,为个人和企业打开一扇通往声音个性化的新大门。 声音克隆的新高度 GPT-SoVITS V2是由RVC变声器创始人“花儿不哭…...

博看书苑 8.8.1| 免费阅读海量图书期刊
博看书苑是一款免费的图书和期刊阅读神器,拥有海量的图书和期刊资源,涵盖了文学、历史、科技、教育等多个领域。无论你是想深入研究某个专业领域,还是想在闲暇时阅读一些轻松的读物,博看书苑都能满足你的需求。更令人惊喜的是&…...

导致动态代理无法使用的原因有哪些?
在动态代理的应用过程中,有时会遇到其无法正常使用的情况。这种现象可能源于多种原因,从网络配置到软件设置,了解和解决这些问题对保持代理的高效运行至关重要。本文将详细探讨导致动态代理无法使用的主要原因及对策,以帮助用户及…...

熟练使用Spring Boot、Spring Cloud Alibaba微服务开发框架,并深入理解其原理 学习要求
1. Spring Boot 核心理解 自动配置:了解 Spring Boot 的自动配置原理(EnableAutoConfiguration),包括如何查看和定制自动配置的内容。需要能解释 Spring Boot 如何减少样板代码。Spring Boot Starter:熟悉各种 starte…...

2024-10-09 问AI: [AI面试题] 描述数据预处理在 AI 中的重要性
文心一言 数据预处理在人工智能(AI)中扮演着至关重要的角色,它是构建高效、准确和可靠AI模型不可或缺的步骤。以下是数据预处理在AI中重要性的详细描述: 1. 提高数据质量 清理和去噪:数据预处理可以识别和纠正数据中…...

Linux中文件的理解
✨前言✨ 📘 博客主页:to Keep博客主页 🙆欢迎关注,👍点赞,📝留言评论 ⏳首发时间:2024年10月16日 📨 博主码云地址:渣渣C 📕参考书籍:…...

益安宁丸,国药准字,值得信赖
益安宁丸真品辨别唯一标准 益安宁丸是由同溢堂药业有限公司独家生产的一款中成药,主要用于调理心血管系统,广泛应用于内地市场及港澳地区。由于其疗效显著,益安宁丸在消费者中享有良好的声誉,被誉为心血管健康的守护者。然而&…...

Django项目的创建及说明(详细图解版)
Django项目的创建及说明 1、安装Django2、创建项目2.1、利用终端创建项目2.2、利用Pycharm企业版创建项目 3、默认文件介绍 1、安装Django 在终端输入下述命令行。 pip install django安装成功后执行如下命令查看Django是否安装好,若正确显示出Django版本号则安装…...

MySQL 9从入门到性能优化-二进制日志
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…...

Cloudlog delete_oqrs_line 未授权SQL注入漏洞复现
0x01 产品简介 Cloudlog 是一个自托管的 PHP 应用程序,可让您在任何地方记录您的业余无线电联系人。使用PHP和MySQL构建的基于Web的业余无线电记录应用程序支持从HF到微波的一般站记录任务 0x02 漏洞概述 Cloudlog delete_oqrs_line 接口存在未授权SQL注入漏洞,未经身份验…...

【Linux】解锁软硬链接奥秘,高效动静态库管理的实战技巧
软硬连接和动静态库 1. 软链接1.1. 概念1.2. 特点1.3. 应用场景 2. 硬链接2.1. 概念2.2. 硬链计数2.3. 特点2.4. 应用场景 3. 动静态库3.1 库存在的原因3.2. 静态库制作与使用3.2.1 打包3.2.2. 使用 3.3. 动态库制作与使用3.3.1. 打包3.3.2. 使用 4. 解决动态库查不到的4种方法…...

【设计模式】Python 后端开发中的工厂模式设计与实现
Python 后端开发中的工厂模式设计与实现 1. 引言 在后端开发中,如何设计一套易于扩展、可维护且灵活的系统架构是开发者面临的重要课题。设计模式在这一过程中扮演了至关重要的角色,尤其是在面向对象编程中,它提供了大量解决重复问题的标准…...

划重点!入门安全测试,这几点要注意!
朋友们,今天我们一起来学习下如何做安全测试。 那么首先,什么是安全测试? 安全测试是评估和验证软件系统、应用程序或网络的安全性和强度的过程。其目标是发现和修复潜在的安全漏洞和脆弱性,以确保系统能够抵御恶意攻击和未授权…...

mysql 09 独立表空间结构
表空间中的页实在是太多了,为了更好的管理这些页面,设计 InnoDB 的大叔们提出了 区 (英文名: extent )的概念。对于16KB的页来说,连续的64个页就是一个 区 ,也就是说一个区默认占用1MB空间大小。…...

linux 虚拟环境下源码安装DeepSpeed
第一步:创建虚拟环境: conda create -n deepspeed python3.10 第二步:进入虚拟环境,安装Pytorch 2.3.1 # CUDA 12.1 conda install pytorch2.3.1 torchvision0.18.1 torchaudio2.3.1 pytorch-cuda12.1 -c pytorch -c nvidia 第…...

常见八大排序算法
今天我们带来数据结构中常见的8大排序算法。 排序算法平均时间复杂度最好情况最坏情况空间复杂度稳定性冒泡排序O(n方)O(n方)O(n方)O(1)稳定插入排序O(n方)O(n方)O(n方)O(1)稳定选择排序O(n方)O(n方)O(n方)O(1)不稳定希尔排序O(n1.3方到1,5方)O(n)O(n方)O(1)不稳定堆排序O(n lo…...

汽车免拆诊断案例 | 2022款大众捷达VS5车行驶中挡位偶尔会锁在D3挡
故障现象 一辆2022款大众捷达VS5汽车,搭载EA211发动机和手自一体变速器,累计行驶里程约为4.5万km。该车行驶中挡位偶尔会锁在D3挡,车速最高约50 km/h,且组合仪表上的发动机故障灯和EPC灯异常点亮。 故障诊断 用故障检测仪检…...

Linux之HugePage的原理与使用
Linux之HugePage的原理与使用 虚拟地址与物理地址虚拟地址物理地址虚拟地址与物理地址的转换 HugePage的概念Linux使用HugePage创建HugePage在程序中使用HugePage 总结 虚拟地址与物理地址 在研究HugePage之前,首先需要明白虚拟地址和物理地址的概念。在计算机系统…...

一步步优化Redis实现分布式锁
分布式锁概念 在多线程的程序里,为了避免同时操作一个共享变量产生数据问题,会加一个互斥锁,以确保共享变量的正确性,使用范围是同一个进程。 那如果是多个进程,需要同时操作一个共享资源,如何互斥呢&…...

C++进阶——二叉搜索树
目录 一、基本概念 二、性能分析 三、模拟实现 四、使用场景 1.key搜索场景 2.key/value搜索场景 一、基本概念 二叉搜索树(Binary Search Tree),看名字就知道,是可以用来搜索数据的一种二叉树。 它可以是空树(一个数据都…...

Require:业界优秀的HTTP管理方案。
方案异步JDK额外依赖特点HttpURLConnection 【优点】Java内置,简单易用。对于简单的HTTP请求和响应处理非常合适。 【缺点】功能相对较少,不支持现代特性(如异步请求、连接池等)。API相对繁琐,处理复杂请求时代码冗长。…...

装饰模式(Decorator Pattern)在 Go 语言中的应用
文章目录 引言什么是装饰模式?在Go语言中的应用定义接口实现具体逻辑创建装饰器使用装饰器 装饰模式 vs 中间件装饰模式中间件区别 总结 引言 在软件开发中,设计模式是解决常见问题的模板。装饰模式(Decorator Pattern)是一种结构…...

Windows系统部署redis自启动服务
文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…...

34岁IT男的职场十字路口:是失业预警,还是转型契机?
在信息技术这片充满机遇与挑战的广袤领域,34岁,一个看似正值壮年却暗藏危机的年龄,成为了许多IT男性不得不面对的职场考验。当“34岁现象”逐渐凸显,我们不禁要问:在这个快速变化的时代,34岁的IT男…...

复试经验分享《三、计算机学科专业基础综合》- 数据结构篇
复试经验分享 三、计算机学科专业基础综合 3.1 数据结构 3.1.1 概念 时间复杂度 时间复杂度是指执行算法所需要的计算工作量一般情况下,按照基本操作次数最多的输入来计算时间复杂度,并且多数情况下我们去最深层循环内的语句所描述的操作作为基本操作…...

数学建模算法与应用 第16章 优化与模拟方法
目录 16.1 线性规划 Matlab代码示例:线性规划求解 16.2 整数规划 Matlab代码示例:整数规划求解 16.3 非线性规划 Matlab代码示例:非线性规划求解 16.4 蒙特卡洛模拟 Matlab代码示例:蒙特卡洛模拟计算圆周率 习题 16 总结…...