当前位置: 首页 > 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")...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...