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

8.C基础_指针基础

指针概述

1、定义与初始化

形式:<数据类型>* <变量名> = <地址>;

int a = 10; 
int *p = &a;

指针的类型不同,p++时的偏移地址量不同,偏移地址 = sizeof(类型)Byte

注意点:

  • 指针的类型要与数据的类型保持一致,a为int,那么p就是int*," * " 称为指针运算符
  • 指针应该赋值地址,&为取地址符,存放的是数据的首地址
  • 指针变量不能赋值普通整数(0除外),不能赋值p=0x1234,而应该赋值p=(类型*)0x1234

2、目标与解引用

目标:指针指向的内存区域的数据。上述中,a就是目标。

解引用(间接访问):使用*p对目标进行访问," * "称为解引用。上述中*p就是解引用

注意:在使用(*p)++时,需要加括号。" * "的优先级低于 " ++ " " -- "

对于上述代码,指针的几种方式有:p、*p、&p,关系如下:

  • p: 指针变量, 它的内容是地址量
  • *p: 指针的目标,它的内容是数据
  • &p: 指针变量占用的存储区域的地址,是个常量

3、指针大小与寻址空间

指针的大小与系统的位数有关。

  • 32位的系统有32根地址线,因此指针大小为32位,4字节
  • 64位的系统有64根地址线,因此指针大小为64位,8字节

注意:指针存放的是地址,地址的大小是固定的。不论是什么类型的指针,大小都为4或8字节。

寻址空间与指针的位数有关。

  • 32位的指针大小可以寻址0~2^32-1范围
  • 64位的指针大小可以寻址0~2^64-1范围

4、空指针

空指针并不是指没有赋值的指针,而是赋值为NULL的指针。NULL就是(void*)0

使用空指针的原因:

  • 指针在定义时没有初始值,值是不确定的。给一个空指针可以防止野指针的出现。
  • 空指针指向0,这个地址不允许访问,访问一定出现段错误,因此可以很快发现指针使用错误

良好的编程习惯:

  • 在定义指针时,要么是赋值非空指针,要么是赋值NULL,防止野指针出现
  • 在函数传入指针参数时,首先判断是否为空,防止后续产生段错误。

5、野指针

野指针指的是指向了一个不确定空间的指针。

有一些野指针在编译上不会产生任何问题,逻辑上却会产生很严重的莫名奇妙的bug

产生野指针的原因:

  • 指针没有初始化,比如只定义了int* p;而没有赋值NULL或其他值
  • 指针越界访问,比如char a[3]最大索引为2,然而去访问了a[3],产生了越界,就是野指针
  • 指针指向空间被释放,比如malloc开辟的空间,free之后再去访问,这就是野指针

指针运算

1、指针±常数

指针±常数的符号有:+、- 、++、--

指针±常数后的值与指针的类型有关,参与运算的是指针保存的地址。

  • 运算结果=当前位置 + 常数 * sizeof(类型)

对如下程序进行分析:

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

这里的p为a的首地址,假设为0x00。p++之后,p的值 = 0x00+1*sizeof(int),这个值就是&a[1]

注意:

  • 这里的p应该与a类型一致,int对应int,不能用char* p去访问int a[5]
  • " 指针+常数 "代表指针向高地址移动," 指针-常数 "代表指针向低地址移动

2、指针-指针

指针-指针运算需要两个参与运算的指针的类型相同,这才是有效运算。运算结果代表这两个指针之间相差了多少个元素。比如上述代码,p++之后值为0x04,p的值为0x00,相减之后并不为4,而是为1,说明p++与p之间相差了一个int元素。代码验证如下:

3、自加自减运算注意点

" ++ "、" -- "的运算优先级比" * "的优先级要高,所以要注意运算的结合顺序。

下面以一个小代码为基础分析*p++、(*p)++、++p、++*p的含义

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

3.1 *p++含义

p++先运算,但++为先用后加,所以运算的值是*p,结果为1。之后p指针+1,指向2

训练:分析*p++ = 3的值

p++先结合,先用再加,所以当前*p=1,之后将3进行赋值,所以a[0]变为3,最后指针+1,指向2

3.2 (*p)++含义

*p先运算,相当于把1取出来,之后再++。同样是先用再加,所以运算值为1,之后1+1变为2

3.3 *++p含义

++p先结合,先加后用。所以运算的值是*(p+1),结果为2,最终p指向2

3.4 ++*p含义

这时++与*已经不在有优先级的事情,因为没有运算的考虑点。在前面*p++时,我们不知道是先和*还是先和++结合,所以考虑优先级。对于++*p,p只能和*结合,所以含义如下:

*p结合之后再++,是先加再用,所以运算结果是1+1=2,最终a[0]=2,*p依旧指向a[0]

4、指针比较

指针可以进行比较,运算符有:>、<、==、!=

指针比较的含义:

  • 与0比较,判断指针是否为空指针NULL
  • 与正常指针比较,存放地址大的指针>存放地址小的指针,如p1=&a[0],p2=&a[1],则p1<p2

相关文章:

8.C基础_指针基础

指针概述 1、定义与初始化 形式&#xff1a;<数据类型>* <变量名> <地址>; int a 10; int *p &a; 指针的类型不同&#xff0c;p时的偏移地址量不同&#xff0c;偏移地址 sizeof(类型)Byte 注意点&#xff1a; 指针的类型要与数据的类型保持一…...

安泰功率放大器使用注意事项有哪些内容和要求

功率放大器是一种广泛应用于音频系统、通信系统和实验室等领域的设备&#xff0c;其作用是将输入信号放大到足够大的功率输出。为了安全使用功率放大器并保证其性能和寿命&#xff0c;以下是一些使用功率放大器时需要注意的事项和要求。 一、选择适当的功率放大器&#xff1a; …...

windows下,使用vs code远程连接云服务器【以CentOS7为例】

windows下&#xff0c;使用vs code远程连接云服务器 1. 下载VS code并准备相关插件2. 使用Remote - SSH远程控制Linux 1. 下载VS code并准备相关插件 1. VS code官网&#xff1a; 下载地址&#xff1a;https://code.visualstudio.com/Download下载合适版本的vs code。 2. 推荐…...

x264 中像素扩边算法源码分析

介绍 在视频编码中,特别是在使用x264这样的H.264/MPEG-4 AVC编码器时,像素扩边(或称为边缘扩展)是一项重要的预处理步骤。像素扩边的目的是在帧的边缘添加额外的像素,这样在编码过程中可以应用滤波器,如去块滤波器(deblocking filter)和水平/垂直滤波器,而不会受到帧…...

数据结构——双链表详解(超详细)

前言&#xff1a; 小编在之前已经写过单链表的创建了&#xff0c;接下来要开始双链表的讲解了&#xff0c;双链表比单链表要复杂一些&#xff0c;不过确实要比单链表更好进行实现&#xff01;下面紧跟小编的步伐&#xff0c;开启今天的双链表之旅&#xff01; 目录 1.概念和结构…...

银行项目利润问题(贪心思想)

import java.util.Comparator; import java.util.PriorityQueue;public class test32 {//输入正数数组costs、正数数组profits、正数K、正数M//costs[i]表示i号项目花费&#xff0c;profits[i]表示i号项目在扣除花费后还挣的钱//K表示有多少项目//M表示初始资金//每做完一个项目…...

SQLite

SQLite Insert 插入 语句 方式1&#xff1a; INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN); 方式2&#xff1a; INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN); &#xff08;如果要…...

浅谈 Mybatis 框架

文章目录 一、什么是MyBatis?1.2、JDBC 二、使用Mybatis2.1、配置MyBatis开发环境2.1.1、配置连接字符串2.1.2、配置MyBatis中的XML路径 2.2、使用MyBatis模式和语法操作数据库 三、使用 Mybatis 进行增删改查操作的要点3.1、ResultMap的用法 四、Mybatis操作难点4.1、#{ } 和…...

【星海随笔】OSPF协议

OSPF OSPF 可在单一自治系统&#xff08;Autonomous System, AS&#xff09;内决策路由。OSPF 是目前内部网关协议中使用最为广泛、性能最优的一个动态路由协议。 (1) OSPF 的特点。可适应大规模的网&#xff0c;路由变化收敛速度块&#xff0c;无路由自环&#xff0c;支持变…...

Vue 使用elementUI-plus el-calendar加 公历转农历 是否节假日 等

效果图&#xff1a; 1. 使用到自定文件 calendar.js /*** 1900-2100区间内的公历、农历互转* charset UTF-8* Author Jea杨(JJonlineJJonline.Cn)* Time 2014-7-21* Time 2016-8-13 Fixed 2033hex、Attribution Annals* Time 2016-9-25 Fixed lunar LeapMonth Param…...

SQL-锁

一.锁的介绍 锁是计算机协调多个进程或线程并发访问一资源的机制。在数据中,除传统的计算资源(CPU,RAM,I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因…...

索引小tips

一、优化原则 关于创建索引&#xff1a; 1. 【强制】InnoDB表必须主键为id int/bigint auto_increment&#xff0c;且主键值禁⽌被更新 。 2. 【强制】InnoDB和MyISAM存储引擎表&#xff0c;索引类型必须为 BTREE 。 3. 【建议】主键的名称以 pk 开头&#xff0c;唯⼀键以…...

2024年【中级消防设施操作员(考前冲刺)】报名考试及中级消防设施操作员(考前冲刺)免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 中级消防设施操作员&#xff08;考前冲刺&#xff09;报名考试是安全生产模拟考试一点通生成的&#xff0c;中级消防设施操作员&#xff08;考前冲刺&#xff09;证模拟考试题库是根据中级消防设施操作员&#xff08;…...

数据结构:栈(含源码)

目录 一、栈的概念和结构 二、栈的实现 2.1 头文件 2.2 各个功能的实现 初始化栈 入栈 出栈 获取栈顶元素和栈中有效个数 判断栈是否为空 栈的销毁 2.3 测试 完整源码 一、栈的概念和结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和…...

如何使用Markdown编辑器

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…...

当代最火的哲学家颜廷利:全球公认十个最厉害的思想家之一

颜廷利书法特点和艺术成就:全球公认十个最厉害的思想家之一&#xff0c;颜廷利教授是一位杰出的‌书法家,他的书法作品不仅体现了‌中国传统文化,而且在国内外享有高度评价,对当代书法艺术产生了深远的影响。在中国十大顶级哲学家排行榜上,当今世界最重要的思想家颜廷利教授的书…...

android13内核增加调试接口给上层使用

总纲 android13 rom 开发总纲说明 目录 1.前言 2.处理方法分析 3.代码参考 3.1方法1 3.2方法2 3.3方法3 3.4方法4 4.彩蛋 1.前言 有时候,我们在开机的过程中,adb服务还没有起来,系统奔溃了,不能正常开机,我们没法看到相关的logcat信息,导致我们不能很快的定…...

linux:phpstudy安装及日常命令使用[表格]

官网安装&#xff1a;小皮面板下载安装&#xff0c;一键管理服务器-小皮面板 (xp.cn) centos安装&#xff1a; yum install -y wget && sudo wget -O install.sh https://dl.xp.cn/dl/xp/install.sh && sudo bash install.sh 快速使用 [rootlocalhost ~]# …...

【python】Linux升级版本

目的 迁移项目包路径到服务器上 查看服务器包是否和本地已有项目python版本相同然后发现~嗯不一样 项目上包时用的3.8~ 服务器用的2.7 查看方法&#xff1a; python -version解决方案 一&#xff1a;项目所有包重新下载 二&#xff1a;升级服务器python版本 第二种步骤&…...

鸿蒙开发if判断有点坑

它的判断和Android的有点不同,归结到底不是同一种语言,数据类型不一样 if (0) {logContent("aa","0") } else {logContent("aa","00")...

万字长文 解析串口通信

一.目标 处理器与外部设备通信的两种方式 单工只允许一个方向 半双工就像对讲机 全双工就像打电话 按照有无时钟同步 分为 1帧等于1个起始位 加上数据位 加上效验位 停止位 波特率是一秒传输的字节数 起始位(Start Bit): 起始位是数据帧的同步标志位,固定为低电平(…...

04.如何在Allegro X中导入机械结构尺寸图纸和注意事项 I Allegro X PCB设计小诀窍系列

大家好&#xff01;在进行PCB设计时&#xff0c;我们经常需要根据机械结构工程师提供的**DXF图纸**来确定板框形状、定位孔位置、元器件高度限制区域等关键信息。如果手动在PCB中重新绘制这些几何图形&#xff0c;不仅耗时&#xff0c;还容易与结构图纸产生偏差——哪怕零点几毫…...

Tomcat安全防护指南:如何防御CVE-2017-12615和CNVD-2020-10487漏洞攻击

Tomcat安全防护实战&#xff1a;从漏洞原理到企业级防御体系构建 最近在帮某金融客户做安全审计时&#xff0c;发现他们的Tomcat服务器竟然还开着AJP端口&#xff0c;而且管理后台用的还是默认密码。这让我想起去年处理过的一次安全事件——攻击者仅用3小时就通过CVE-2017-1261…...

Agent入门指南:从概念到实战,小白也能掌握AI新范式!

本文深入浅出地介绍了AI Agent的概念、原理和应用&#xff0c;帮助读者理解Agent并非简单的LLM调用&#xff0c;而是一种系统设计范式。文章详细阐述了Agent的核心要素&#xff0c;包括目标、决策、工具、反馈和停止条件&#xff0c;并探讨了Agent与传统自动化、RPA和聊天机器人…...

视频博主必备!用DeepSeek V2批量生成SRT字幕的3种高阶玩法

视频博主必备&#xff01;用DeepSeek V2批量生成SRT字幕的3种高阶玩法 在内容创作领域&#xff0c;字幕早已从简单的辅助功能演变为提升观看体验、扩大受众群体的关键工具。对于视频博主而言&#xff0c;高效生成精准字幕不仅能节省大量后期时间&#xff0c;更能为内容带来专业…...

MSG文件高效提取工具:解放双手的Outlook邮件解析方案

MSG文件高效提取工具&#xff1a;解放双手的Outlook邮件解析方案 【免费下载链接】msg-extractor Extracts emails and attachments saved in Microsoft Outlooks .msg files 项目地址: https://gitcode.com/gh_mirrors/ms/msg-extractor 副标题&#xff1a;你是否还在为…...

专注核心创新:用快马AI生成openclaw101开发效率工具链

在开发机械臂控制相关的项目时&#xff0c;我发现很多时间都花在了重复造轮子上。特别是做openclaw101这类机械爪的仿真或实体开发时&#xff0c;每次都要从零开始写轨迹规划、数据滤波这些基础功能。最近尝试用InsCode(快马)平台整理了一套工具链&#xff0c;效率提升非常明显…...

突破性GPU显存释放技术:解决ComfyUI模型占用难题的底层API方案

突破性GPU显存释放技术&#xff1a;解决ComfyUI模型占用难题的底层API方案 【免费下载链接】ComfyUI-Easy-Use In order to make it easier to use the ComfyUI, I have made some optimizations and integrations to some commonly used nodes. 项目地址: https://gitcode.c…...

如何用STM32F103C8T6+ESP8266打造低成本智能家居环境监测系统?

基于STM32与ESP8266的智能家居环境监测系统实战指南 1. 项目概述与核心价值 在物联网技术快速普及的今天&#xff0c;智能家居系统正从高端奢侈品转变为大众可负担的实用解决方案。本项目以STM32F103C8T6单片机为核心&#xff0c;搭配ESP8266 WiFi模块&#xff0c;构建了一套…...

csvlens作为库使用教程:在Rust项目中集成CSV查看功能

csvlens作为库使用教程&#xff1a;在Rust项目中集成CSV查看功能 【免费下载链接】csvlens Command line csv viewer 项目地址: https://gitcode.com/gh_mirrors/cs/csvlens 想要在你的Rust应用中添加一个功能强大、交互式的CSV数据查看器吗&#xff1f;csvlens不仅是一…...