c++指针
内存地址
将内存抽象成一个很大的一维字符数组,编码就是对内存的每一个字节分配一个32位或64位的二进制编号。这个内存编号称之为内存地址(唯一),内存中的每一个数据都会分配相应的地址。
#include<iostream> using namespace std; int main() {int num = 10;cout << &num << endl;cout << sizeof(&num);//32位系统分配32位编码,4个字节;//64位系统分配64位编码,8个字节;return 0; }
注意:这里的地址是8个字节
地址用16进制的数表示,一位16进制数表示4位的二进制数,2^4 = 16
如:8:1000 9:1001 A:1010 B:1011
指针和指针变量
指针:和int,double等类似,是一种独立的数据类型。这种类型的变量存储的值是内存地址。
指针变量:本质就是变量,只是该变量存储的是内存地址,而不是普通的数据。不同类型的指针变量所占用的存储单元长度是相同的。
#include<iostream> using namespace std; int main() {int* p1 = nullptr;int num = 10;cout << sizeof(num) << endl;//这个表示num的数据类型int在电脑中占4个字节cout << sizeof(p1) << endl;//指针,内存地址8个字节cout << sizeof(*p1) << endl;//加了一个*,解引用,表示指针所指向的int类型的值cout << &p1 << endl;//存储这个整型指针的地址cout << sizeof(&p1) << endl;cout << &(*p1) << endl;//指针所指向的地址return 0; }
野指针
指的是没有被初始化过的指针。指针变量未初始化时不会自动成为 nullptr,而是一个随机值。
int main() { int* p; // 未初始化std::cout<< *p << std::endl; // 未初始化就被使用return 0;
}
因此,为了防止出错,对于指针初始化时都是赋值为 nullptr,这样在使用时编译器就会直接报错,产生非法内存访问。
悬空指针
悬空指针,指针最初指向的内存已经被释放了的一种指针。(指针操作超越变量的作用域,比如函数返回栈内存的指针或引用)
int main() { int * p = nullptr;int* p2 = new int;p = p2;delete p2;
}
此时 p和p2就是悬空指针,指向的内存已经被释放。继续使用这两个指针,行为不可预料。需要设置为p=p2=nullptr。此时再使用,编译器会直接保错。
野指针和悬空指针,无法通过简单地判断是否为 nullptr 避免,所以要习惯在初始化时赋值或析构时赋为nullptr。
void*
是一种特殊的指针类型,可以存放任意对象的地址,但不能直接操作void*
指针所指的对象。
指针与数组名的区别
-
修改内容上的差别:
char a[] = "hello";
a[0] = 'H';
char *p = "world"; // p 指向常量字符串,该字符串存储在文字常量区,不可更改
// p[0] = "W" // 所以这个赋值有问题
“world” 是const char*类型,不可更改
如果要改用下面的数组先定义,然后再改。
int main() {char a[] = "hello";char *p = a; // 这样让指针指向数组 a,而非常量字符串,就可以修改了p[0] = 'H';a[1] = 'E';printf("%d", sizeof(p)); // 64 位机器std::cout << p << std::endl; return 0;
}
//输出:8HEllo
数组指针与指针数组
type (*p)[]; // 数组指针
/*
type a[],a 是一个数组,数组内元素都是 type 类型,将 a 换成 (*p),
可以理解为 (*p)是一个数组,数组内元素都是 type 类型,那么 p 就是指向这样的数组的指针,即数组指针。
*/type *p[]; // 指针数组
/*
type *p[]即(type *)p[],则 p 是一个 type* 类型的数组(类比int a[10],a 是 int 型数组)
即 p 是一个数组,数组内元素都是指针( type *)
*/
const int seq_cnt = 6;
vector<int> *seq_addrs[seq_cnt] = {&fibonacci, &lucas, &pell,&triangular, &square, &pentagonal
};
// seq_addrs 是一个数组,存储 vector<int> * 型的指针,
// seq_addrs[0] 的内容为指针,该指针指向 fibonacci,
// 而 fibonacci 的类型为 vector<int>。
EssentialC++ 29
指针函数与函数指针
指针函数:返回类型是指针的函数,如
char *StrCat(char *ptr1, char *ptr2)
{char *p;do something;return p;
}
函数指针:指向函数的指针,如
#include <stdio.h>
int max(int x, int y)
{return x > y? x: y;
}
int main()
{// int max(int x, int y);int (*ptr)(int, int);ptr = max;int max_num = (*ptr)(12, 18); // int max_num = ptr(12, 18);也是对的printf("%d", max_num);return 0;
}
// 打印 18。
int (*ptr)(); // “()” 表明该指针指向函数,函数返回值为 int
int (*ptr)[3]; // “[]” 表明该指针指向一维数组,该数组里包含三个元素,每一个元素都是int类型。
数组名指向了内存中一段连续的存储区域,可以通过数组名的指针形式去访问,也可以定义一个相同类型的指针变量指向这段内存的起始地址,从而通过指针变量去引用数组元素。
每一个函数占用一段内存区域,而函数名就是指向函数所占内存区的起始地址的函数指针(地址常量),故函数指针解引用与不解引用没有区别 。通过引用函数名这个函数指针让正在运行的程序转向该入口地址执行函数的函数体,也可以把函数的入口地址赋给一个指针变量,使该指针变量指向该函数。
解读复杂指针使用右左法则:首先从未定义的标识符所在的圆括号看起,然后往右看,再往左看。每当遇到圆括号就调转阅读方向。一旦解析完圆括号里的东西,就跳出圆括号。重复这个过程,直到整个声明解析完毕。
int (*func)(int *p, int (*f)(int*));
// func左边有一个*表明func是一个指针,跳出圆括号看右边,右边有括号,说明func是一个函数指针,
// 指向的函数接收两个形参,分别是整型指针 int * 和函数指针 int (*f)(int*),返回值为 int。int (*func[5])(int *p);
// func 是一个数组,含5个元素,左边*号,表明 func 是一个指针数组(由于[]优先级高于*,func先跟[]结合,然后*修饰func[5],故该数组的元素都是指针)。
//再往右看,是括号,说明 func 里的指针是函数指针,函数指针所指向的函数接收 int * 型参数并返回 int。int (*(*func)[5])(int *p);
// func 是一个指针,指向含有 5 个元素的数组,数组里的元素都是指针,而且都是函数指针,
// 函数指针指向的函数接收 int * 型形参并返回 int。int (*(*func)(int *p))[5];
// func 是一个指针,该指针指向一个函数,该函数接收 int * 型参数返回一个指针,
// 返回的指针指向一个数组,该数组含有 5 个元素,每一个元素都是 int 型。
常引用作为函数参数
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用
void foo(const string &s) {cout << s << endl;
} // 如果形参里的 const 去掉,程序就报错,
// 因为 ss 与 "world!" 都是常量,你不能把一个 const 类型转换成非 const 类型。
// 所以 foo() 形参必定要用 const 修饰。int main() {const string ss("hello ");//此处有const,且“hello”本来就是一个常量foo(ss);foo("world!");
}
对于常量类型的变量,其引用也必须是常量类型的;对于非常量类型的变量,其引用可以是非常量的,也可以是常量的。但是要注意,无论什么情况都不能使用常量引用修改其引用的变量的值。
相关文章:

c++指针
内存地址 将内存抽象成一个很大的一维字符数组,编码就是对内存的每一个字节分配一个32位或64位的二进制编号。这个内存编号称之为内存地址(唯一),内存中的每一个数据都会分配相应的地址。 #include<iostream> using namesp…...

Qt 贴图实现方向控制盘
一、效果走一波 二、使用贴图进行不规则按钮的设计与开发 开发环境描述:QtCreator Qt Desinger (1)首先准备待贴的图片 图片的切片大小必须一样,背景为透明的;将待贴的所有图片都切下来,文件标明名称…...

建模杂谈系列211 ADBS的取数模式以及衔接
说明 这应该是进一步的完善ADBS的工作模式。 之所以做A系列的架构工具,就是为了可以实现大型的数据处理、存储。从应用上说,是为了提高效率,并达到超高的效果。 为了达到这个目的,就必须从数据架构上、任务调度上、逻辑架构上作…...

易基因:RRBS揭示晚年锻炼可以减缓骨骼肌表观遗传衰老(甲基化年龄)|新研究
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。2021年12月21日,美国阿肯色大学、德克萨斯大学和肯塔基大学的研究人员合作在《Aging Cell》杂志发表了题为“Late-life exercise mitigates skeletal muscle epigenetic aging”…...

JVM的基本知识
JVM JVM是java的虚拟机,是一个十分复杂的东西,所以掌握的要求比较高.本文主要是研究JVM的三大话题 JVM内存划分JVM类加载JVM的垃圾回收 JVM内存划分 java程序要执行的时候,JVM会先申请一块空间,这里就涉及到JVM的内存划分 堆 : 放的是new 出来的对象栈: 放的是方法之间的调…...

STM32移植FreeRTOS操作系统
一、FreeRTOS源码下载(1)移植钱得准备前菜对吧,我们先来去官网瞄一瞄网址:https://freertos.org/zh-cn-cmn-s/ 第一步:点击下载FreeRTOS第二步:选择版本下载(我选择稳定版本)注&…...

【专项训练】泛型递归、树的递归
递归和循环没有明显的边界! 不要进行人肉递归! 找最近重复子问题,直接写递归! 数学归纳法思维:1,2,…… 70. 爬楼梯 https://leetcode.cn/problems/climbing-stairs/ 互斥,且加在一起是全部答案! 动态规划法:用数组做递推,就是动态规划!!! class Solution...

React18 setState是同步还是异步?
相信大家对于react的setState肯定是不陌生了, 这是一个用于更新状态的函数. 但是在之前有一道非常经典的面试题就是关于setState是同步还是异步的问题, 具体可以参考我之前写的一篇文章: 一篇文章彻底理解setState是同步还是异步!. 对于react 18之前的版本, 上文说的…...

Kafka消费者 TCP管理
Kafka消费者 TCP管理创建 TCPFindCoordinator连接协调者消费数据TCP 连接数关闭 TCP 连接消费者的程序入口类是 KafkaConsumer 构建 KafkaConsumer 时 ,不会创建任何 TCP 连接TCP 连接是用 KafkaConsumer.poll 创建 创建 TCP poll 创建 TCP 的地方 : 发起 FindC…...

软考高级备考哪一个类型好些?
软考高级是比中级和初级难,科目就要考三科,选择题基础知识简答题案例分析写作论文 软考高级科目有:信息系统项目管理师、系统分析师、系统架构设计师、网络规划师、系统规划与管理师。如下: 软考高级中高项信息系统项目管理师师比…...

2023 HBU 天梯赛第一次测试 题目集
目录 1 建校日期 2 发射小球 3 背上书包去旅行 4 吉利的数字 5 向前走 6 热水器 7 走方格 8 朋友圈 9 交保护费 10 走方格 11 和与积 12 缩短字符串 13 买木棒 1 建校日期 在2022 ICPC沈阳站上,东北大学命题组给参赛的选手们出了一道签到题࿰…...

华为OD机试题,用 Java 解【子序列长度】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…...

内网环境解决SSL证书问题
本来这个没什么好写的,但是坑实在有点多,不得不写个文章记录下来。 创建证书看这里!!! 很多知识点要结合这个页面内容来看。 创建证书已经看过相关文章,然后用unity跑的时候发现连不上,完全没…...

数据分析方法01对比分析法
对比分析法 1、概念 基于相同的数据标准下,把两个及以上相互联系的指标数据进行比较,准确量化的分析他们的差异,说明研究对象在规模大小,水平高低,速度快慢等的不同表现,目的是为了找到差异的原因&#x…...

基于SMOKE多模式排放清单处理技术及EDGAR/MEIC清单制作与VOCs排放量核算
查看原文>>>基于SMOKE多模式排放清单处理技术及EDGAR/MEIC清单制作与VOCs排放量核算 (qq.com)随着我国经济快速发展,我国面临着日益严重的大气污染问题。近年来,严重的大气污染问题已经明显影响国计民生,引起政府、学界和人们越来越…...

CSS流动布局-页面自适应
项目中经常会碰到页面自适应的问题,例如:商城的列表展示、分类列表展示等页面,如下: 该页面会随着页面的放大缩小而随之发生变化,这种自适应的页面布局在大屏幕、小屏幕、不同的浏览器设备上都应该呈现出与设计匹配的…...

3.Elasticsearch初步进阶
3.Elasticsearch初步进阶[toc]1.文档批量操作批量获取文档数据批量获取文档数据是通过_mget的API来实现的在URL中不指定index和type请求方式:GET请求地址:_mget功能说明:可以通过ID批量获取不同index和type的数据请求参数docs:文档数组参数_index:指定index_type:指定type_id:指…...

优思学院|六西格玛管理的核心理念是什么?
六西格玛管理是一种基于数据分析的质量管理方法,旨在通过降低过程的变异性来达到质量稳定和优化的目的。该方法以希腊字母“σ”为名,代表标准差,是衡量过程变异性的重要指标。 六西格玛管理的核心理念是“以客户为中心、以数据为基础、追求…...

第十七节 多态
多态 什么是多态? ●同类型的对象,执行同一个行为,会表现出不同的行为特征。 多态的常见形式 父类类型 对象名称new子类构造器; 接口 对象名称new 实现类构造器; 多态中成员访问特点 ●方法调用:编译看左边,运行看右边。 ●变量调用:编译看…...

[vue]提供一种网站底部备案号样式代码
演示 vue组件型(可直接用) 组件代码:copyright-icp.vue <template><div class"icp">{{© ${year} ${author} }}<a href"http://beian.miit.gov.cn/" target"_blank">{{ record }}</a…...

python第四天作业~函数练习
目录 作业4、判断以下哪些不能作为标识符 A、a B、¥a C、_12 D、$a12 E、false F、False 作业5: 输入数,判断这个数是否是质数(要求使用函数 for循环) 作业6:求50~150之间的质数是…...

linux安装influxdb-rpmyum方式
一、influxdb的安装InfluxDB简介时序数据库InfluxDB版是一款专门处理高写入和查询负载的时序数据库,用于存储大规模的时序数据并进行实时分析,包括来自DevOps监控、应用指标和IoT传感器上的数据主要特点:专为时间序列数据量身订造高性能数据存…...

死锁
1.死锁的定义 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法…...

C++基础了解-05-C++常量
C常量 一、C常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 常量就像是常规的变量,只不过常量的值在定义后不能进…...

深度学习笔记-2.自动梯度问题
通过反向传播进行自动求梯度1-requires_grad问题2-梯度3- detach() 和 with torch.no_grad()4- Tensor.data.requires_gradPyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播. 1-requires_grad问题 requires_gradTrue …...

一文读懂倒排序索引涉及的核心概念
基础概念相信对于第一次接触Elasticsearch的同学来说,最难理解的概念就是倒排序索引(也叫反向索引),因为这个概念跟我们之前在传统关系型数据库中的索引概念是完全不同的!在这里我就重点给大家介绍一下倒排序索引&…...

Java基础算法题
以创作之名致敬节日 胜固欣然,败亦可喜。 --苏轼 目录 练习1 : 优化代码 扩展 : CRTL Alt M 自动抽取方法 练习2: 方法一: 方法二: 方法三: Math : 顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态方法来便于我们实…...

「SAP ABAP」你真的了解OPEN SQL的DML语句吗 (附超详细案例讲解)
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…...

数据结构3——线性表2:线性表的顺序结构
顺序结构的基本理解 定义: 把逻辑上相邻的数据元素存储在物理上相邻(占用一片连续的存储单元,中间不能空出来)的存储单元的存储结构 存储位置计算: LOC(a(i1))LOC(a(i))lLOC(a(i1))LOC(a(i))l LOC(a(i1))LOC(a(i))l L…...

VMware虚拟机搭建环境通用方法
目录一、前期准备1.下载并安装一个虚拟机软件二、开始创建虚拟机1.配置虚拟机硬件相关操作2.虚拟机网络相关操作三、开机配置相关内容0.开机遇到报错处理(选看--开机没有报错请忽略)1.开始配置2.开机之后配置3.使用xshell远程登录4.使用xshell配置虚拟机…...