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、定义与初始化 形式:<数据类型>* <变量名> <地址>; int a 10; int *p &a; 指针的类型不同,p时的偏移地址量不同,偏移地址 sizeof(类型)Byte 注意点: 指针的类型要与数据的类型保持一…...

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

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

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

数据结构——双链表详解(超详细)
前言: 小编在之前已经写过单链表的创建了,接下来要开始双链表的讲解了,双链表比单链表要复杂一些,不过确实要比单链表更好进行实现!下面紧跟小编的步伐,开启今天的双链表之旅! 目录 1.概念和结构…...
银行项目利润问题(贪心思想)
import java.util.Comparator; import java.util.PriorityQueue;public class test32 {//输入正数数组costs、正数数组profits、正数K、正数M//costs[i]表示i号项目花费,profits[i]表示i号项目在扣除花费后还挣的钱//K表示有多少项目//M表示初始资金//每做完一个项目…...
SQLite
SQLite Insert 插入 语句 方式1: INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN); 方式2: INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN); (如果要…...

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

Vue 使用elementUI-plus el-calendar加 公历转农历 是否节假日 等
效果图: 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
一、优化原则 关于创建索引: 1. 【强制】InnoDB表必须主键为id int/bigint auto_increment,且主键值禁⽌被更新 。 2. 【强制】InnoDB和MyISAM存储引擎表,索引类型必须为 BTREE 。 3. 【建议】主键的名称以 pk 开头,唯⼀键以…...

2024年【中级消防设施操作员(考前冲刺)】报名考试及中级消防设施操作员(考前冲刺)免费试题
题库来源:安全生产模拟考试一点通公众号小程序 中级消防设施操作员(考前冲刺)报名考试是安全生产模拟考试一点通生成的,中级消防设施操作员(考前冲刺)证模拟考试题库是根据中级消防设施操作员(…...

数据结构:栈(含源码)
目录 一、栈的概念和结构 二、栈的实现 2.1 头文件 2.2 各个功能的实现 初始化栈 入栈 出栈 获取栈顶元素和栈中有效个数 判断栈是否为空 栈的销毁 2.3 测试 完整源码 一、栈的概念和结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和…...
如何使用Markdown编辑器
欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…...

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

android13内核增加调试接口给上层使用
总纲 android13 rom 开发总纲说明 目录 1.前言 2.处理方法分析 3.代码参考 3.1方法1 3.2方法2 3.3方法3 3.4方法4 4.彩蛋 1.前言 有时候,我们在开机的过程中,adb服务还没有起来,系统奔溃了,不能正常开机,我们没法看到相关的logcat信息,导致我们不能很快的定…...
linux:phpstudy安装及日常命令使用[表格]
官网安装:小皮面板下载安装,一键管理服务器-小皮面板 (xp.cn) centos安装: 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 查看方法: python -version解决方案 一:项目所有包重新下载 二:升级服务器python版本 第二种步骤&…...
鸿蒙开发if判断有点坑
它的判断和Android的有点不同,归结到底不是同一种语言,数据类型不一样 if (0) {logContent("aa","0") } else {logContent("aa","00")...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...