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

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++指针

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

Qt 贴图实现方向控制盘

一、效果走一波 二、使用贴图进行不规则按钮的设计与开发 开发环境描述&#xff1a;QtCreator Qt Desinger &#xff08;1&#xff09;首先准备待贴的图片 ​ 图片的切片大小必须一样&#xff0c;背景为透明的&#xff1b;将待贴的所有图片都切下来&#xff0c;文件标明名称…...

建模杂谈系列211 ADBS的取数模式以及衔接

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

易基因:RRBS揭示晚年锻炼可以减缓骨骼肌表观遗传衰老(甲基化年龄)|新研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2021年12月21日&#xff0c;美国阿肯色大学、德克萨斯大学和肯塔基大学的研究人员合作在《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源码下载&#xff08;1&#xff09;移植钱得准备前菜对吧&#xff0c;我们先来去官网瞄一瞄网址&#xff1a;https://freertos.org/zh-cn-cmn-s/ 第一步&#xff1a;点击下载FreeRTOS第二步&#xff1a;选择版本下载&#xff08;我选择稳定版本&#xff09;注&…...

【专项训练】泛型递归、树的递归

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

React18 setState是同步还是异步?

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

Kafka消费者 TCP管理

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

软考高级备考哪一个类型好些?

软考高级是比中级和初级难&#xff0c;科目就要考三科&#xff0c;选择题基础知识简答题案例分析写作论文 软考高级科目有&#xff1a;信息系统项目管理师、系统分析师、系统架构设计师、网络规划师、系统规划与管理师。如下&#xff1a; 软考高级中高项信息系统项目管理师师比…...

2023 HBU 天梯赛第一次测试 题目集

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

华为OD机试题,用 Java 解【子序列长度】问题

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

内网环境解决SSL证书问题

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

数据分析方法01对比分析法

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

基于SMOKE多模式排放清单处理技术及EDGAR/MEIC清单制作与VOCs排放量核算

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

CSS流动布局-页面自适应

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

3.Elasticsearch初步进阶

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

优思学院|六西格玛管理的核心理念是什么?

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

第十七节 多态

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

[vue]提供一种网站底部备案号样式代码

演示 vue组件型&#xff08;可直接用&#xff09; 组件代码&#xff1a;copyright-icp.vue <template><div class"icp">{{© ${year} ${author} }}<a href"http://beian.miit.gov.cn/" target"_blank">{{ record }}</a…...

【FastAPI 2.0流式AI响应实战指南】:3步接入、5大避坑点、性能提升300%的工业级落地方案

第一章&#xff1a;FastAPI 2.0流式AI响应的核心演进与工业价值FastAPI 2.0 将原生流式响应能力从实验性支持升级为一级公民特性&#xff0c;彻底重构了高吞吐 AI 服务的构建范式。其核心在于深度整合 ASGI 3.0 的异步流语义与 Starlette 的 StreamingResponse 基础设施&#x…...

聊天记录丢失?这款开源工具让数据安全不再愁

聊天记录丢失&#xff1f;这款开源工具让数据安全不再愁 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾经历过手机意外损坏后丢失数年聊天记录的痛苦&#xff1…...

跨品牌路由器桥接实战:TP-LINK(AC1200)与FAST(FWR303)混合组网方案

1. 为什么需要跨品牌路由器桥接&#xff1f; 家里WiFi信号差是很多人的痛点。我去年搬进新家时就遇到这个问题——书房和卫生间经常只有一格信号&#xff0c;视频通话卡成PPT。后来发现是承重墙太多&#xff0c;单一路由器根本穿不透。换更贵的路由器&#xff1f;成本太高。拉…...

Audacity:终极免费音频编辑软件的完整使用指南

Audacity&#xff1a;终极免费音频编辑软件的完整使用指南 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity Audacity是一款功能强大的开源音频编辑软件&#xff0c;提供专业级的音频录制、编辑和处理功能。这款跨平…...

芯片创业资金消耗与团队构建全解析

芯片初创公司的资金消耗分析&#xff1a;从架构设计到流片量产1. 芯片创业的资金挑战概述芯片设计行业作为典型的技术密集型产业&#xff0c;其创业过程面临着独特的资金挑战。与互联网创业不同&#xff0c;芯片公司从组建团队到产品量产需要经历漫长的研发周期和巨额的资金投入…...

pose-search:5分钟搭建你的人体姿态搜索系统

pose-search&#xff1a;5分钟搭建你的人体姿态搜索系统 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 在人工智能技术飞速发展的今天&#xff0c;人体姿态搜索已成为计算机视觉领域的重要突破。p…...

CyberChef终极指南:浏览器内的免费网络安全瑞士军刀

CyberChef终极指南&#xff1a;浏览器内的免费网络安全瑞士军刀 【免费下载链接】CyberChef CyberChef: 是一个开源的在线工具&#xff0c;可以帮助安全分析师自动化处理和分析网络安全相关的任务&#xff0c;如数据加密、压缩和混淆等。适合安全分析师和网络工程师使用 CyberC…...

告别乱码!手把手教你用阿里妈妈数黑体+LVGL 8.3打造炫酷中文界面(附图标字体生成全流程)

告别乱码&#xff01;手把手教你用阿里妈妈数黑体LVGL 8.3打造炫酷中文界面&#xff08;附图标字体生成全流程&#xff09; 在智能家居控制面板、工业HMI等嵌入式设备开发中&#xff0c;中文显示一直是工程师的痛点。传统解决方案要么占用过多Flash空间&#xff0c;要么显示效…...

springboot-vue+nodejs 的酒店客房预定管理系统的设计与实现

目录技术栈选择系统模块划分后端实现前端实现中间层实现数据库设计支付集成测试与部署项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术栈选择 Spring Boot 作为后端框架&#xff0c;提供 RESTful API 接口&#xff1b;Vue.…...

告别重复造轮子:用快马平台一键生成高效yolov11开发模板

告别重复造轮子&#xff1a;用快马平台一键生成高效yolov11开发模板 最近在做一个基于yolov11的目标检测项目&#xff0c;发现从零开始搭建开发环境特别费时间。光是配环境、写基础代码、整合工具链这些重复性工作&#xff0c;就占用了将近一半的开发周期。后来尝试用InsCode(…...