C语言—指针2

1. const 修饰变量

1.1 const修饰变量

变量被const修饰时,变量此时为常变量,本质为常量,语法上不可被修改,但是如果此时需要修改变量值,可以通过指针的方式修改。

虽然此时通过指针的方式确实修改了变量的值,但这并不符合const修饰变量的语法,为了防止const修饰的变量被修改,可以修饰指针变量,防止const修饰变量被修改。

1.2 const 修饰指针变量

const在*pb前表示pb指向的对象不可被修改,此时就很好的保护const修饰的变量值,上述const修饰的指针变量还可以写成:int const *pb,语法上也是支持的。此时const修饰的指针变量可以防止指向的对象被修改,但是指针变量本身是可以被修改的。

原本指针变量是为了存放b的地址,指针变量本身未被修饰,存放变量c的地址后导致指针变量指向其它内存空间,为了防止指针变量指向其它内存空间,使用const修饰指针变量,修饰后的指针变量存放的地址不可被修改。

结论:const修饰指针变量的时候

const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。 但是指针变量本⾝的内容可变。

const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。

2. 野指针

野指针指向的内存空间是随机的,不可知的,没有明确限制的。

2.1 野指针成因

2.1.1 指针未初始化

2.1.2. 指针越界访问

2.1.3 函数返回局部变量的指针

在vs2022环境下多次输出的结果:多次输出的均为随机值

2.2 如何规避野指针

2.2.1 初始化指针

需要使用指针是,要明确指针存放的地址,对其进行初始化,当暂时不明确指针存放的地址,可以将其初始化为空指针NULL,c语言中空指针为void*0。

2.2.2 ⼩⼼指针越界

需要访问数组元素时,可以求出元素的个数,利用for循环进行访问,防止越界

2.2.3 指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性

3. assert 断⾔

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏,这个宏常常被称为“断⾔”。

assert在c语言库函数网站的详细介绍:assert - C++ Reference

assert不仅可以用于判断指针,还可以用于表达式的判断:

按F10启动调试,执行第二条assert语句时,系统报错:窗口输出具体的报错原因

断言失败:Assertion failed: *pa>*pb,说明assert括号内的表达式为假,执行断言。

4. 指针的使⽤和传址调⽤

4.1 模拟strlen函数的实现

4.2 传值调⽤和传址调⽤

实现一个函数交换两个数

第一次交换并没有成功交换,输出的结果还是num1=10  num2=20,这是因为Swap1函数接收的函数参数时,开辟了新的内存空间进行存num1和num2,改变的为x和y形参的的值,,函数栈帧销毁时,x和y的值并不能存储返回,因此x和y只是实参的一份临时拷贝,改变形参并不一定改变实参;

第二次交换交换成功,将num1和 num2的地址作为参数传参时,接收的函数参数改变时,是通过地址指向的位置改变,x指向num1的地址,y指向num2的位置,此时改变形参可以改变实参。

传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。

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

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

相关文章

高级架构软考之网络OSI网络模型

高级架构软考之网络: 1.OSI网络模型: a.物理层: a.物理传输介质物理连接,负责数据传输,并监控数据 b.传输单位:bit c.协议: d:对应设备:中继器、集线器 b.数据链路层: a.…

el-table计算表头列宽,不换行显示

1、在utils.js中封装renderHeader方法 2、在el-table-column中引入: 3、页面展示:

MySQL OCP和Oracle OCP怎么选?

近期oracle 为庆祝 MySQL 数据库发布 30 周年,Oracle 官方推出限时福利:2025 年 4 月 20 日至 7 月 31 日期间,所有人均可免费报考 MySQL OCP(Oracle Certified Professional)认证考试(具体可查看MySQL OCP…

2025最新免费视频号下载工具!支持Win/Mac,一键解析原画质+封面

软件介绍 适用于Windows 2025 最新5月蝴蝶视频号下载工具,免费使用,无广告且免费,支持对原视频和封面进行解析下载,亲测可用,现在很多工具都失效了,难得的几款下载视频号工具,大家且用且珍…

Python学习之路(八)-多线程和多进程浅析

在 Python 中,多线程(Multithreading) 和 多进程(Multiprocessing) 是实现并发编程的两种主要方式。它们各有优劣,适用于不同的场景。 一、基本概念 特性多线程(threading)多进程(multiprocessing)并发模型线程共享内存空间每个进程拥有独立内存空间GIL(全局解释器锁…

Spark缓存--persist方法

1. 功能本质 persist:这是一个通用的持久化方法,能够指定多种不同的存储级别。存储级别决定了数据的存储位置(如内存、磁盘)以及存储形式(如是否序列化)。 2. 存储级别指定 persist:可以通过传入…

裸辞8年前端的面试笔记——JavaScript篇(一)

裸辞后的第二个月开始准备找工作,今天是第三天目前还没有面试,现在的行情是一言难尽,都在疯狂的压价。 下边是今天复习的个人笔记 一、事件循环 JavaScript 的事件循环(Event Loop)是其实现异步编程的关键机制。 从…

什么是死信队列?死信队列是如何导致的?

死信交换机(Dead Letter Exchange,DLX) 定义:死信交换机是一种特殊的交换机,专门用于**接收从其他队列中因特定原因变成死信的消息**。它的本质还是交换机,遵循RabbitMQ中交换机的基本工作原理&#xff0c…

9. 从《蜀道难》学CSS基础:三种选择器的实战解析

引言:当古诗遇上现代网页设计 今天我们通过李白的经典诗作《蜀道难》来学习CSS的三种核心选择器。这种古今结合的学习方式,既能感受中华诗词的魅力,又能掌握实用的网页设计技能。让我们开始这场穿越时空的技术之旅吧! 一、HTML骨架…

三角网格减面算法及其代表的算法库都有哪些?

以下是三角网格减面算法及其代表库/工具的详细分类,涵盖经典算法和现代实现: ​​1. 顶点聚类(Vertex Clustering)​​ ​​原理​​:将网格空间划分为体素栅格,合并每个栅格内的顶点。​​特点​​&#…

URP - 屏幕图像(_CameraOpaqueTexture)

首先需要在unity中开启屏幕图像开关才可以使用该纹理 同样只有不透明对象才能被渲染到屏幕图像中 若想要该对象不被渲染到屏幕图像中,可以将其Shader的渲染队列改为 "Queue" "Transparent" 如何在Shader中使用_CameraOpaqueTexture&#xf…

vue 和 html 的区别

使用 Vue.js 和原生 HTML 开发 Web 应用有显著的区别,主要体现在开发模式、功能扩展、性能优化和维护性等方面。以下是两者的对比分析: 🧱 原生 HTML(HTML CSS JavaScript) 特点: 静态结构:H…

LeetCode[226] 翻转二叉树

思路: 使用递归,归根结底还是左右节点互相倒,那么肯定需要一个temp节点在中间传递,最后就是递归,没什么说的 代码: /*** Definition for a binary tree node.* public class TreeNode {* int …

幂等的几种解决方案以及实践

目录 什么是幂等? 解决幂等的常见解决方案: 唯一标识符案例 数据库唯一约束 案例 乐观锁案例 分布式锁(Distributed Locking) 实践精选方案 首先 为什么不直接使用分布式锁呢? 自定义实现幂等组件&#xff01…

PowerShell中的Json处理

1.定义JSON字符串变量 PS C:\WINDOWS\system32> $body {"Method": "POST","Body": {"model": "deepseek-r1","messages": [{"content": "why is the sky blue?","role"…

奥威BI:AI+BI深度融合,重塑智能AI数据分析新标杆

在数字化浪潮席卷全球的今天,企业正面临着前所未有的数据挑战与机遇。如何高效、精准地挖掘数据价值,已成为推动业务增长、提升竞争力的核心议题。奥威BI,作为智能AI数据分析领域的领军者,凭借其创新的AIBI融合模式,正…

【Linux网络】网络协议基础

网络基础 计算机网络背景 独立模式:计算机之间相互独立 网络互联:多台计算机连接在一起,完成数据共享 局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起 广域网WAN:将远隔千里的计算机都连在一起 所谓"局域网"和"广域网"只是一个相对的概念.比…

LabVIEW表面粗糙度测量及算法解析

在制造业和科研领域,表面粗糙度测量对保障产品质量、推动材料研究意义重大。表面粗糙度作为衡量工件表面加工质量的关键指标,直接影响着工件诸如磨损、密封、疲劳等机械性能。随着技术的发展,LabVIEW 在表面粗糙度测量及数据处理中发挥着不可…

深入探索 JavaScript 中的模块对象

引言 在现代 JavaScript 开发中,模块化编程是一项至关重要的技术。它允许开发者将代码拆分成多个独立的模块,每个模块专注于单一功能,从而提高代码的可维护性、可测试性和复用性。而模块对象则是模块化编程中的核心概念之一,它为…

Linux——Mysql数据库

目录 一,数据库简介 二,数据库的基本概念 1,数据 2,数据库和数据库表 3,数据库管理系统和数据库系统 三,主流数据库介绍 四,数据库的两大类型 1,关系型数据库 主键 外键 2…