2025_1_29 C语言学习中关于指针
1. 指针
指针就是存储的变量的地址,指针变量就是指针的变量。
1.1 空指针
当定义一个指针没有明确指向内容时,就可以将他设置为空指针
int* p = NULL;
这样对空指针的操作就会使程序崩溃而不会导致出现未定义行为,因为程序崩溃是宏观的,被察觉的,未定义行为是不被察觉的。
所以在操作一个不明确指针的时候,最好对它进行判空处理。
if (p == NULL){//为空的处理
}
1.2 野指针
只要指针指向的内存区域是未知的,那么该指针就是野指针。
因为指向的内存区域未知,那么操作该指针就会导致未定义行为
1.3 指针的传参
C语言函数的传参都是值传递的
这意味着当调用函数时,传递给函数的是实际参数的副本,而不是参数本身。因此,函数内部对参数的修改不会影响外部的实际参数。
那为什么指针作为参数传递时就会直接改变其指向的内容呢?
那是因为指针作为实参传递给函数的形参,这个形参是实参的拷贝,但是实参的形参都指向的是同一个地址空间。 相当于:
int a = 10;
int* p1 = &a;
int* p2 = &a;
p1和p2是两个不同的指针变量,但存储的内容是一样的。
即对指向那片内存空间的指针做出解引用改变的操作就会发生数值的改变。
void swap(int* a, int* b) {int tmp = *a; *a = *b;*b = tmp;
}void swap_ptr(int* a, int* b) {int* tmp = a;a = b;b = tmp;
}
void swap_ptr_pro(int** pa, int** pb) {int* tmp = *pa;*pa = *pb;*pb = tmp;
}
int main() {int a = 10, b = 20;swap(&a, &b);//改变printf("%d %d\n", a, b);int* pa = &a, * pb = &b;swap_ptr(pa, pb);//不改变printf("%d %d\n", *pa, *pb);a = 10, b = 20;swap_ptr_pro(&pa, &pb);//改变printf("%d %d\n", *pa, *pb);printf("%d %d", a, b);return 0;
}
上述代码swap函数就可以交换a和b的值,但是swap_ptr就不行,因为它交换的指针变量,而不是指向的值,交换指针变量是不会有结果的,因为他只是拷贝。
第三个函数swap_ptr_pro更是重量级,我在第二个函数中想通过交换两个指针变量来实现数值的交换,相当于
int* pa = a;
int* pb = b;
//转化为
int* pa = b;
int* pb = a;
这样直接printf(“%d %d\n”, *pa, *pb);就可以交换两个值,但是第二个函数交换的只是拷贝,不能实现,所以第三个函数我直接传二级指针,直接对一级指针pa,pb做修改。*pa就相当于pa的地址,这次我的形参是int ** a, int ** b.和&pa,&pb指向的是同一块内存,所以可以直接修改pa和pb,以实现交换 *pa和 *pb的值。
但是
printf("%d %d\n", *pa, *pb);
printf("%d %d", a, b);
这两句运行出来结果不一样,为啥?

这是因为我只交换了*pa和 *pb的值,而不是a和b的值。
交换a,b的值需要pa和pb
交换 *pa和 *pb的值需要&pa,&pb。
2.数组名于指针的关系
数组名可以看作是不可改变指向的指针,数组名可以看作是指向首元素的指针
只有两种情况下数组名才不代表首元素地址:
1:sizeof(arr) 这种情况下计算的是数组一共占用多少字节
2:&arr 和 arr相区别,arr代表的是数组的首元素地址,&arr代表数组的地址
2.1 数组指针和指针数组
数组指针:本质是一个指针,是一个指向数组变量的指针
int arr[4];
int(*p)[4] = &arr;
指针数组:本质是一个数组,是一个存储指针变量的数组,即数组存储的元素是指针变量
int* p[3] = {&a, &b, &c};
2.2常量指针和指针常量
int main() {int a = 10;const int* p1 = &a;int* const p2 = &a;int const* p3 = &a;return 0;}
const int * p1 = &a;
- 含义:p1 是一个指向 const int 的指针。
- 解释:p1 指向的值是 const 的,即不能通过 p1 修改它所指向的值。
int * const p2 = &a;
- 含义:p2 是一个指向 int 的常量指针。
- 解释:p2 本身是 const 的,即不能修改 p2 指向的地址,但可以通过 p2 修改它所指向的值。
int const * p3 = &a;
- 含义:p3 是一个指向 const int 的指针。
- 解释:p3 指向的值是 const 的,即不能通过 p3 修改它所指向的值。
const右边是只有指针变量,就限制的是这个指针变量,即这个指针变量不能再指向其他的值
const右边还有int或者,那么限制的就是指针变量指向的值,即指针指向的值不能修改
相关文章:
2025_1_29 C语言学习中关于指针
1. 指针 指针就是存储的变量的地址,指针变量就是指针的变量。 1.1 空指针 当定义一个指针没有明确指向内容时,就可以将他设置为空指针 int* p NULL;这样对空指针的操作就会使程序崩溃而不会导致出现未定义行为,因为程序崩溃是宏观的&…...
解决ImportError: cannot import name ‘notf‘
解决ImportError: cannot import name ‘notf‘ 报错: 报错代码: from torch.utils.tensorboard import SummaryWriter cannot import name notf from tensorboard.compat 解决方法: pip install numpy1.26.0 测试代码: py…...
HTML<label>标签
例子 三个带标签的单选按钮: <form action"/action_page.php"> <input type"radio" id"html" name"fav_language" value"HTML"> <label for"html">HTML</label><br&…...
shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。
文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…...
大数据Hadoop入门1
目录 相关资料 第一部分 1.课程内容大纲和学习目标 2.数据分析和企业数据分析方向 3.数据分析基本流程步骤 4.大数据时代 5.分布式和集群 6.Linux操作系统概述 7.VMware虚拟机概念与安装 8.centos操作系统的虚拟机导入 9.VMware虚拟机常规使用、快照 第二部分 1.课…...
《智能家居“孤岛危机”:设备孤立如何拖垮系统优化后腿》
在科技飞速发展的今天,智能家居不再是遥不可及的概念,它正逐渐走进千家万户,为我们描绘出舒适便捷的未来生活蓝图。想象一下,下班回家前,你可以通过手机远程开启空调,让室内温度恰到好处;到家时…...
DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型
DeepSeek 中文名深度求索人工智能基础技术研究有限公司(简称“深度求索”或“DeepSeek”),成立于2023年,是一家专注于实现AGI的中国公司。 在本月初推出 DeepSeek-R1后,该公司宣称其在执行数学、编码和自然语言推理等任务时“性能可与OpenAI…...
网络安全攻防实战:从基础防护到高级对抗
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在信息化时代,网络安全已经成为企业、政府和个人必须重视的问题。从数据泄露到勒索软件攻击,每一次…...
9【如何面对他人学习和生活中的刁难】
我们在学习的过程中,会遇到很多来自于他人的刁难与嘲讽,如果处理不好,这会大大影响我们的心情,从而影响学习的效率 我建议,如果你学习或生活中也遇到了类似的问题,不要去生气,更不要发生冲突&a…...
kafka消费者详细介绍(超级详细)
文章目录 一、Kafka 消费者与消费者组1.1 Kafka 消费者(Consumer)概述1.1.1 消费者工作流程1.1.2 消费者的关键配置 1.2 Kafka 消费者组(Consumer Group)概述1.2.1 消费者组的工作原理1.2.2 消费者组的优点1.2.3 消费者组的再均衡…...
数据结构选讲 (更新中)
参考 smWCDay7 数据结构选讲2 by yyc 。 可能会补充的: AT_cf17_final_j TreeMST 的 F2 Boruvka算法 目录 AT_cf17_final_j Tree MST AT_cf17_final_j Tree MST link 题意 给定一棵 n n n 个点的树,点有点权 w i w_i wi,边有边权。建立…...
OpenBMC:简介
通常在服务器主板上,有一个独立的微处理器,叫作BMC(Baseboard Manager Controller),用于与主机(host)进行通信,提供带外的方式查询服务器的状态和信息,并进行管理服务器。 OpenBMC是Linux Foundation的开源BMC项目&am…...
java 正则表达式匹配Matcher 类
Matcher 类 用法 在 Java 中,Matcher 类是用于匹配正则表达式的工具,而 group() 方法是 Matcher 类中的一个重要方法,用于提取匹配结果中的捕获组(captured groups)。以下是对 group() 方法的详细解释: 1.…...
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…...
CSS(快速入门)
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…...
使用 concurrently 实现前后端一键启动
使用 concurrently 实现前后端一键启动 本文适合: 前后端分离项目(如 React Node.js),希望通过一条命令同时启动前端和后端服务。 工具链: Node.js、npm、concurrently。 耗时: 3 分钟。 文章目录 使用 c…...
常见端口的攻击思路
端口号端口说明攻击方向21/22/69FTP/TFTP文件传输协议匿名上传/下载、嗅探、爆破2049NFS服务配置不当139Sanba服务爆破、远程代码执行389Ldap目录访问协议注入、匿名访问、弱口令22SSH远程连接爆破、SSH映射隧道搭建、文件传输23Telnet远程连接爆破、嗅探、弱口令3389RDP远程桌…...
大数据治理实战:架构、方法与最佳实践
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段,尤其在数据驱动决策和人工智能应用日益普及的背景下&…...
忘记宝塔的访问地址怎么找
在linux中安装宝塔面板后会生成网址、账号和密码 如果网址忘记了那将进不去宝塔面板该怎么办呢? bt命令 我们输入 bt 命令的时候,是在根目录里面进行操作的。 / bt 我们根据自己的需要,选择对应的数字就可以了。 bt 14 输入 14 查看面板默…...
SQL教程-基础语法
INSERT INTO 新增数据 INSERT INTO 数据表名 VALUES (值1,值2,值3,...) DELETE 删除数据 DELETE FROM 数据表名 WHERE 查询条件 UPDATE 修改数据 UPDATE 数据表名 SET 字段1 值1, 字段2值2, ... WHERE 查询条件 SELECT 查询数据 #查询数据 SELECT 字段1, 字段2, ... FROM 数…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
Tauri2学习笔记
教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...
