【017】C++ 指针变量详解,理解指针变量

news2024/10/5 13:41:21

C++ 指针变量详解

  • 引言
  • 一、内存概述
  • 二、指针变量
    • 2.1、地址和指针变量的关系
    • 2.2、定义指针变量
    • 2.3、指针变量的初始化
    • 2.4、指针类型
    • 2.5、案例
    • 2.6、注意事项
  • 三、数组元素的指针
    • 3.1、概述
    • 3.2、在使用中 [ ] 就是 *()的缩写
    • 3.3、指向同一数组的元素的两个指针变量间的关系
  • 四、字符串与指针
    • 4.1、字符数组
    • 4.2、字符串指针变量
  • 总结

引言


💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。
👉
🎖️ CSDN实力新星,社区专家博主
👉
🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、高级编程;掌握各个知识点。
👉
🔔 专栏地址:C++从零开始到精通
👉
🔔 博客主页:https://blog.csdn.net/Long_xu


🔔 上一篇:【016】C++预处理详解(内存分区、变量的存储、头文件、宏等)

一、内存概述

对于32位平台的进程,其内存空间大小限制为4GB(2的32次方),其中1GB是操作系统保留的虚拟地址空间。因此,32位进程最多只能使用3GB的内存空间。

而对于64位平台的进程,其内存空间大小限制高达16EB(2的64次方),实际上远远超过了目前可用的物理内存容量。这意味着64位进程可以利用更多的内存资源来提高应用程序性能和响应速度。

在这里插入图片描述
系统为内存的每一个字节分配32 bit / 64 bit 的地址编码(虚拟地址),这个编号称为地址。

无论任何类型的地址,都是存储单元的编号,在32位平台上永远占4字节,在64位平台上永远占8字节。

在这里插入图片描述
取地址得到的是首地址。

二、指针变量

2.1、地址和指针变量的关系

地址就是内存的地址编号。
指针变量本质上是变量,只是该变量保存的是内存的地址编号,而不是普通数值。
在这里插入图片描述

2.2、定义指针变量

格式:

<类型名> *<变量名>;

示例:

int *data;
short *data;
long data;
double data;
char *data;
float *data;

无论任何类型的指针变量,在32位平台上永远占4字节,在64位平台上永远占8字节。

指针变量和普通变量间建立关系:

int num;
int *p;
p=&num;//取地址,p指向num
*p=10;//取内容、内容赋值

2.3、指针变量的初始化

指针变量在操作前必须指向合法的地址空间。
(1)指针变量如果不初始化,立即操作会出现段错误。
(2)指针变量如果没有指向合法的空间,建议初始化为nullptr 或 NULL。不要操作指向nullptr 或 NULL的指针变量。
(3)将指针变量初始化为合法的地址:变量地址、动态申请的地址、函数入口地址等。

int num;
int *p=NULL;
p=&num;

2.4、指针类型

(1)指针变量自身的类型:把变量名去掉,剩下的就是指针类型。

int num;
int *p;//指针类型为int *
// p是指针变量
p=&num;
// 使用时,&和*相遇,从右往左依次匹配。
*&p==p;

(2)指针变量指向的类型。

int *p;//p指向的类型是int

(3)指针变量的指向类型决定取值宽度。
在这里插入图片描述
(4)指针变量的指向类型决定了 +1 跨度。
在这里插入图片描述
(5)*p等价于num

int num=0;
int* p=&num;
// *p == num

2.5、案例

在这里插入图片描述

int num=0x01020304;

案例一,取出0x0102的值:

short *p=(short *)&num;
short get=*(p+1);

案例二,取出0x02的值:

char *p=(char *)&num;
char get=*(p+2);

案例三,取出0x0203的值:

char *p=(char *)&num;
short get=*(short *)(p+1);

2.6、注意事项

(1)void不能定义普通变量。因为系统无法计算void的大小,无法开辟空间。
(2)void* 可以定义指针变量,因为系统知道指针变量永远是4字节或8字节。此时的指针变量就是万能的一级指针变量,能保存任意一级指针的地址编码。万能指针一般用于函数的形参,达到算法操作多种数据类型的目的。

int num=0;
void *p=&num;

short num2=10;
p=&num2;

注意,不要直接对void * 的指针变量取 *,如果一定要对void * 的指针变量取值 *,就不行强转才行。

int num=0;
void *p=&num;

cout<<(int *)p<<endl;

(3)指针变量未初始化不能取 *。
(4)指针变量初始化为NULL或nulptr,也不能取 *。
(5)指针变量不要越界访问。

char ch=0;
int *p=&ch;//越界

char *p2=&ch;
p2++;//越界

在这里插入图片描述

三、数组元素的指针

3.1、概述

数组元素的指针是指向数组中单个元素的内存地址。在C和C++语言中,数组名可以被解释为指向数组第一个元素的指针,也就是说,它包含了该数组的内存地址。

要访问数组中的特定元素,可以使用下标运算符[]来访问它们。例如,如果a是一个整型数组,则a[0]表示第一个元素,a[1]表示第二个元素,以此类推。

可以通过将其加上偏移量来获取任何给定元素的地址。例如,&a[2]表示第三个元素(假设数组从零开始编号),因为它是从第一个元素开始的两个整数位置。

通过使用指向特定元素的指针变量来引用该元素,可以对其进行操作。例如,在C语言中,以下代码将把第三个元素设置为10:

int a[5];
int *p = &a[2];
*p = 10;

此时,p指向a[2](即第三个)并将其值更改为10。

数组元素的指针变量和数组名等价:
在这里插入图片描述

3.2、在使用中 [ ] 就是 *()的缩写

int arr[]={1,2,3,4,5};
cout<<"arr[1]="<<arr[1]<<endl;		// 输出2
cout<<"*(arr+1)="<<*(arr+1)<<endl;	// 输出2

cout<<"*(1+arr)="<<*(1+arr)<<endl;	// 输出2
cout<<"1[arr]="<<1[arr]<<endl;		// 输出2
// 

[ ]是*()的缩写,[ ]左边的值放在+的左边,[ ]里面的值放在+右边,整体取 *。

分析为什么arr == &arr[0]:

&arr[0]==&*(arr+0)==arr+0==arr。

示例:

int arr[]={1,2,3,4,5};
int *p=arr+3;


p[-1]=arr+3-1=arr+2=3。
p[1]=arr+3+1=arr+4=5。

3.3、指向同一数组的元素的两个指针变量间的关系

  1. 两个指针变量相减,等于它们的元素个数。
  2. 两指针变量赋值,则它们指向同一处。
  3. 两指针变量判断相等,用于判断它们是否指向同一处。
  4. 两指针变量判断大小(>、<、>=、<=、!=),用于判断它们的位置关系。
  5. 两指针变量不能相加,相加是无意义的。

四、字符串与指针

4.1、字符数组

char *str1[128]="hello world";

str1是字符数组,开辟128字节存放字符串"hello world"。sizeof(str1)是128。
在这里插入图片描述

4.2、字符串指针变量

char *str2="hello world";

这个代码的含义是将字符串的首地址赋给str2。sizeof(str2)是4或8。注意与字符数组的区别。
在这里插入图片描述
注意:不能给字符串指针变量赋值,会报错误,因为文字常量区不能赋值。

str2[3]='F';//错误的,引发异常

总结

C++ 中的指针变量是一个特殊类型的变量,它存储了另一个变量的地址。在使用指针变量时,需要注意以下几点:

  1. 指针的声明:声明一个指针需要使用星号 (*) 运算符,并在其前面加上数据类型。例如:int *ptr;

  2. 取地址运算符 &:取地址运算符 & 可以用于获取一个变量的内存地址。例如:int num = 5; int *ptr = #

  3. 解引用运算符 *:解引用运算符 * 用于访问指针所指向的实际值。例如:int num = 5; int *ptr = # cout << "Value of num is: " << *ptr;

  4. 动态内存分配:动态内存分配允许程序在运行时请求操作系统分配内存。使用 new 关键字来分配内存,并使用 delete 关键字释放已经分配的内存。

  5. 空指针检查:空指针是未初始化或者被设置为 null 的指针。在使用空指针时需要进行检查,以避免程序崩溃或者出现其他问题。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6月销量狂欢季:测评自养号助力,引爆跨境电商销量!

随着夏季的到来&#xff0c;跨境电商卖家们迎来了一个极佳的销售机会。6月作为夏季的重要节点&#xff0c;各种活动和节日都为卖家们提供了引流和销售的良机。然而&#xff0c;要真正实现销量的爆发&#xff0c;单纯依靠传统的营销手段可能难以达到预期的效果。在这篇文章中&am…

AI+边缘,是如何加速制造转型的?

在现代工业中&#xff0c;提起智慧工厂、智能制造有一个经久不衰的话题&#xff0c;那便是IT和OT的融合。 IT&#xff08;Information Technology&#xff09;部门专注于处理数据&#xff0c;整个业务系统需要它来维持运营。而OT&#xff08;Operation Technology&#xff09;…

2023智源大会议程公开 |智能的物质基础专题论坛

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请这一领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、图灵奖得主Geoffrey Hinton、OpenAI创…

基于OA的采购系统和专业的招标采购管理系统区别

当前采购信息化百家争鸣&#xff0c;既有初级版的审批和记录电子化&#xff0c;也有中级版的业务全流程电子化&#xff0c;还有升级版的数智化创新形式&#xff08;如电商平台、智能评标、供应商风险评估、专家行为画像、大数据统计分析等&#xff09;。 近年来&#xff0c;招标…

Zotero文献在word中的引用

前提 确保你的word中有Zotero插件。如下图示&#xff1a; 具体操作 Step01 Zeroto中下载样式 在Zotero中添加相应的文献样式&#xff0c;具体如下&#xff1a; 打开Zotero“编辑”中的首选项&#xff0c;打开“引用”&#xff0c;从“获取更多样式”中搜寻你想要的文献样…

JAVA开发(手工处理数据库表数据的一些示例算法)

背景&#xff1a; 在项目开发中&#xff0c;有时候需要手动处理一下数据库表的数据。涉及到数据得到备份、恢复&#xff0c;清洗&#xff0c;计算&#xff0c;合并等操作。 举例记录一下最近对数据的一些处理过程。 1、对数据表进行数据量统计 select count(*) from table…

API接口的重要性和好处|附加淘宝api接口展示案例|商品数据采集演示

随着互联网的发展&#xff0c;API接口已经成为许多企业进行信息交流和数据管理的重要工具。通过API接口&#xff0c;企业之间能够快速、可靠地进行数据传输和信息共享&#xff0c;从而提高了企业的生产效率和服务质量。以下是API接口的重要性和好处的文章&#xff1a; 1.提高生…

Zabbix从入门到精通以及案例实操系列

1、Zabbix入门 1.1、Zabbix概述 Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制&#xff0c;允许用户为几乎任何事件配置基于邮件的告警。这样可以快速反馈服务器的问题。基于已存储的数据&#xff0c;Zabbix提供了出色的报告和…

5.2.2 IP地址的分配和使用

5.2.2 IP地址的分配和使用 我们已经学习了分类的IP地址&#xff0c;我们就来一起学习一下在实际的应用中IP地址是如何分配和使用的。在最初的IP地址编址方案中&#xff0c;因特网的每个物理网络都必须被分配一个唯一的网络地址&#xff0c;该网络上的主机每个主机都使用该网络…

Jenkins——maven 插件配置

文章目录 一、Maven 的集成二、在执行job的机器上安装好maven三、下载 maven 插件四、配置全局工具五、Maven 相关使用1、新建 job2、自由风格 job 中命令行使用 mvn 命令3、构建操作 一、Maven 的集成 在 Jenkins 上构建 Java 项目时需要使用 Maven 来进行构建打包 二、在执…

【笔记】微机原理及接口技术2 -- 存储器与IO接口技术

目录 存储器存储器分类存储器常用性能指标半导体存储器随机存取存储器 RAM动态随机存储器 DRAM三态缓冲器只读存储器 ROM存储器与 CPU 链接存储空间扩展方式内存寻址方法&#xff08;片选方式&#xff09;存储器小节思考题 I/O 接口技术IO 接口概述IO 端口编址寻址输入输出控制…

让仓库“零误差”,WMS仓库管理系统助力供应链升级

现代供应链的核心是以消费者和库存管理为中心&#xff0c;通过降低库存来提高产品的流通速度和供应链效率。而在信息技术快速发展的今天&#xff0c;企业的库存管理也面临着新的挑战&#xff1a; 1.仓库货品种类多&#xff0c;数量多&#xff0c;且摆放混乱&#xff0c;加大了查…

RWKV – transformer 与 RNN 的强强联合

在 NLP (Natural Language Processing, 自然语言处理) 领域&#xff0c;ChatGPT 和其他的聊天机器人应用引起了极大的关注。每个社区为构建自己的应用&#xff0c;也都在持续地寻求强大、可靠的开源模型。自 Vaswani 等人于 2017 年首次提出 Attention Is All You Need 之后&am…

SAP-MM-发票行项目格式

目的&#xff1a;SAP提供标准事物代码屏幕变式&#xff0c;但因各个公司运用的方式不同&#xff0c;可采用屏幕变式进行自定义&#xff0c;方便最终用户使用&#xff1b; 方案&#xff1a;采用屏幕变式T-CODE&#xff1a;OLMRLIST对相应事物代码进行调整&#xff1a; 案例&am…

ASCII Unicode UTF-8等等编码介绍

目录 背景 Unicode UTF-8 ISO-8859-1 GB2312和GBK ANSI UTF-16LE 和UTF-16BE UTF-16 LE 和BE是什么 如何处理字节序问题 "带有BOM的UTF-8"又是什么&#xff1f; 背景 由于计算机是美国人发明的&#xff0c;因此最早只有127个字母被编码到计算机中&#x…

1.5k star,搭建一个属于自己或团队的WIKI知识管理系统

项目简介 zyplayer-doc是一款适合团队和个人使用的WIKI文档管理工具&#xff0c;同时还包含数据库文档、Api接口文档。 体验地址&#xff1a;http://zyplayer.com 在线文档&#xff1a;http://doc.zyplayer.com 各模块介绍 zyplayer-doc-manage 文档管理后台 具有项目模块…

ue4技术方向学习路线如何安排?

作为初学者&#xff0c;您可能会感到UE4&#xff08;Unreal Engine 4&#xff09;的学习曲线很陡峭。但是&#xff0c;只要您有一个良好的学习路线和资源&#xff0c;就可以轻松地掌握UE4技术方向。下面是一个可以帮助您快速入门UE4技术方向的学习路线安排。 第一阶段&#xff…

【资料分享】TVS二极管

瞬态电压抑制二极管也称为TVS二极管&#xff0c;是一种保护用的电子零件&#xff0c;可以保护电器设备不受导线引入的电压尖峰破坏。 TVS二极管会和要保护的电路并联。 当其电压超过突崩溃准位时&#xff0c;直接分流过多的电流。TVS二极管是箝位器&#xff0c;会抑制超过其崩…

java企业级信息系统开发学习笔记08 初探MyBatis实现简单查询

文章目录 一、学习目标1.了解什么是MyBatis框架2.掌握基于配置文件方式使用MyBatis3.掌握采用接口方式使用MyBatis 二、创建数据库与表1.在数据库中创建一个用户表 三、基于配置文件方式使用MyBatis(一)、创建一个Maven项目&#xff08;二&#xff09;、添加相关依赖&#xff0…

Android H5移动调试技巧——Chrome /Edge /QQ Inspect

Android APP项目原生的Html5做&#xff0c;cordova框架技术。苦于调试不便。稍微了解一下浏览器调试插件。 Chrome Inspect 使用该调试技巧&#xff0c;调试移动端中—自身开发的Hybrid APP、微信、UC、QQ、抖音等打开的页面&#xff0c;就像在电脑chrome调试一样方便。 手机…