8.C基础_指针基础

news2024/9/27 21:22:37

指针概述

指针存放的都是首地址。

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

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

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

相关文章

LMS4124R-13000S01激光测距仪使用方法【sick LMS4124R-13000S01】

1、下载SOPAS&#xff1a; 点击下载SOPAS 1 SOPAS 自动搜索设备 正常上电及网络连接&#xff0c;打开 SOPAS 自动搜索到 LMS41XXX&#xff0c;并且可以看到其版本号&#xff0c; SN,IP 信息&#xff0c;产品默认 IP 为 192.168.0.1. 2 搜索设备 鼠标双击“LMS41XXX(SN 18460…

15.DMDIS 工具优化

文章目录 前言一、安装部署安装数据源转换作业监控 二、性能优化问题 1 &#xff1a;DMETL 卡顿问题问题 2 &#xff1a;DM -> HIVE 的迁移速度慢问题 3 &#xff1a;ORACLE -> DM 的迁移速度慢问题 4 &#xff1a;GP -> DM 的迁移速度慢问题 5 &#xff1a;DM -> …

AI芯片成本压力影响利润

Supermicro&#xff08;SMCI&#xff09;近日公布的季度业绩低于预期&#xff0c;主要因其生产的最新人工智能&#xff08;AI&#xff09;芯片服务器成本高企&#xff0c;导致经调整后的毛利率未能达到分析师的预期水平。这一消息使得其股价在盘后交易中急剧下跌14%&#xff0c…

江科大/江协科技 STM32学习笔记P19

文章目录 TIM编码器接口编码器接口简介正交编码器编码器接口电路、基本结构工作模式 TIM编码器接口 改写旋转编码器计次程序&#xff0c;通过定时器的编码器接口自动计次&#xff0c;与之前触发外部中断手动计次相比&#xff0c;节约软件资源&#xff0c;当有电机高速旋转时&a…

邮件推送接口如何集成以提升用户通知效率?

邮件推送接口的优化策略有哪些&#xff1f;如何设计邮件API接口&#xff1f; 邮件推送接口的集成在这一过程中发挥了重要作用&#xff0c;能够显著提升用户通知效率。AokSend将探讨如何通过集成邮件推送接口来优化用户通知机制&#xff0c;从而为企业和用户带来更高的价值。 …

Java并发—ReetrantLock详解

目录 一、ReetrantLock的特性 1、非阻塞获取锁 2、带超时的锁获取: 3、锁的公平性 4、锁的可中断性 5、Condition条件变量 6、锁的可重入性 可重入锁 不可重入锁 7、性能优化 二、ReentrantLock和Synchronized的区别 1、语法和使用方式 2、锁的获取和释放 3、高级…

量化方法介绍

一、定义 分类模型量化接口进阶量化支持的模式/流/硬件 二、实现 分类 模型量化接口进阶 https://pytorch.org/docs/stable/quantization-support.html 2.1 算子融合 定义&#xff1a; 将多个算子融合到一起&#xff0c;运算时可以加快运行速度。 import torch # define a…

三星和Nvidia在HBM3E芯片领域的竞争与合作

引言 近期&#xff0c;全球半导体市场的焦点逐渐聚焦在了高带宽内存&#xff08;HBM&#xff09;芯片领域&#xff0c;尤其是三星电子和Nvidia之间的竞争与合作。这两家科技巨头正在为下一代人工智能&#xff08;AI&#xff09;处理器的高性能需求而竞相研发先进的HBM3E存储解决…

模拟面试题1

目录 一、JVM的内存结构&#xff1f; 二、类加载器分为哪几类&#xff1f; 三、讲一下双亲委派机制 为什么要有双亲委派机制&#xff1f; 那你知道有违反双亲委派的例子吗&#xff1f; 四、IO 有哪些类型&#xff1f; 五、Spring Boot启动机制 六、Spring Boot的可执行…

基于MindFormers实现GPT2模型的推理

前言 针对MindFormers的安装&#xff0c;可参考本专栏里的另一篇博客 安装MindFormers&#xff08;昇腾910&#xff09;-CSDN博客 pipeline方式 from mindformers import pipeline from mindformers import GPT2LMHeadModel, GPT2Config, GPT2Tokenizer tok GPT2Tokenizer…

Kafka安装部署+go整合

1、Kafka的安装 1、下载与安装Kafka Kafka官网https://Kafka.apache.org/downloads 所以这里推荐的版本是 : https://archive.apache.org/dist/kafka/2.7.2/kafka_2.12-2.7.2.tgz 将下载下来的安装包直接解压到一个路径下即可完成Kafka的安装&#xff0c;这里统一将Kafka安装…

4种防止模态框弹出时页面滚动的方法

1. Overflow:hidden — 经典方法 overflow:hidden CSS 属性是一种久经考验的防止滚动的方法。只需将一个类&#xff08;例如&#xff0c;no-scroll&#xff09;添加到 <body> 标签&#xff0c;并将其链接到带有 overflow:hidden 的 CSS 规则。 .no-scroll {overflow: h…

地表最强?免费!AI画图模型:Stable Diffusion 3 来了!

前言 Stability AI终于推出了备受期待的Stable Diffusion 3 API。经过几个月技术报告的酝酿&#xff0c;现在用户终于可以实际体验这个模型啦。 虽然完全开源的SD3模型仍在开发中&#xff0c;Stability AI已承诺对普通用户免费开放。用户现在可以通过Fireworks AI平台访问SD3 …

电脑出现错误vcomp140.dll是什么情况?vcomp140.dll丢失怎样修复?

很多小伙伴在使用电脑时会突然收到提示vcomp140.dll文件丢失导致应用程序无法打开&#xff0c;不能正常运行。这是怎么一回事呢&#xff1f;其实就是vcomp140.dll文件被破会坏导致文件被丢失。具体的解决办法其实很简单一起来看看吧。 关于vcomp140.dll文件丢失的详细分析 在计…

我在高职教STM32——EXTI之外部按键中断(2)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

小顶堆实现查找前 K 个高频元素

小顶堆&#xff08;Min-Heap&#xff09;通常用于实现优先队列。在小顶堆中&#xff0c;根节点的值是最小的&#xff0c;因此通过从堆中移除根节点&#xff0c;你可以高效地获取当前优先级最高&#xff08;即值最小&#xff09;的元素。 优先队列的特点&#xff1a; 允许高效…

2024年【化工自动化控制仪表】考试及化工自动化控制仪表考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 化工自动化控制仪表考试参考答案及化工自动化控制仪表考试试题解析是安全生产模拟考试一点通题库老师及化工自动化控制仪表操作证已考过的学员汇总&#xff0c;相对有效帮助化工自动化控制仪表考试内容学员顺利通过考…

Struts2框架漏洞(附漏洞修复方法)

Apache Struts 2 最初被称为 WebWork 2&#xff0c;它是一个简洁的、可扩展的框架&#xff0c;可用于创建企业级Java web应用程序。设计这个框架是为了从构建、部署、到应用程序维护方面来简化整个开发周期。 Struts 2在2007年7月23日发布的第一个Struts 2漏洞S2-001。 …

dbeaver设置字体大小

1、【窗口】-【首选项】 2、【外观】-【颜色-字体】-【Dbeaver Fonts】-【Monospace font】 双击或者右边编辑都可以打开设置

【Linux】—— 僵尸进程、孤儿进程

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;Linux跬步积累 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0…