当前位置: 首页 > news >正文

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>标签

例子 三个带标签的单选按钮&#xff1a; <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.课…...

《智能家居“孤岛危机”:设备孤立如何拖垮系统优化后腿》

在科技飞速发展的今天&#xff0c;智能家居不再是遥不可及的概念&#xff0c;它正逐渐走进千家万户&#xff0c;为我们描绘出舒适便捷的未来生活蓝图。想象一下&#xff0c;下班回家前&#xff0c;你可以通过手机远程开启空调&#xff0c;让室内温度恰到好处&#xff1b;到家时…...

DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型

DeepSeek 中文名深度求索人工智能基础技术研究有限公司(简称“深度求索”或“DeepSeek”)&#xff0c;成立于2023年&#xff0c;是一家专注于实现AGI的中国公司。 在本月初推出 DeepSeek-R1后&#xff0c;该公司宣称其在执行数学、编码和自然语言推理等任务时“性能可与OpenAI…...

网络安全攻防实战:从基础防护到高级对抗

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在信息化时代&#xff0c;网络安全已经成为企业、政府和个人必须重视的问题。从数据泄露到勒索软件攻击&#xff0c;每一次…...

9【如何面对他人学习和生活中的刁难】

我们在学习的过程中&#xff0c;会遇到很多来自于他人的刁难与嘲讽&#xff0c;如果处理不好&#xff0c;这会大大影响我们的心情&#xff0c;从而影响学习的效率 我建议&#xff0c;如果你学习或生活中也遇到了类似的问题&#xff0c;不要去生气&#xff0c;更不要发生冲突&a…...

kafka消费者详细介绍(超级详细)

文章目录 一、Kafka 消费者与消费者组1.1 Kafka 消费者&#xff08;Consumer&#xff09;概述1.1.1 消费者工作流程1.1.2 消费者的关键配置 1.2 Kafka 消费者组&#xff08;Consumer Group&#xff09;概述1.2.1 消费者组的工作原理1.2.2 消费者组的优点1.2.3 消费者组的再均衡…...

数据结构选讲 (更新中)

参考 smWCDay7 数据结构选讲2 by yyc 。 可能会补充的&#xff1a; AT_cf17_final_j TreeMST 的 F2 Boruvka算法 目录 AT_cf17_final_j Tree MST AT_cf17_final_j Tree MST link 题意 给定一棵 n n n 个点的树&#xff0c;点有点权 w i w_i wi​&#xff0c;边有边权。建立…...

OpenBMC:简介

通常在服务器主板上&#xff0c;有一个独立的微处理器&#xff0c;叫作BMC(Baseboard Manager Controller)&#xff0c;用于与主机(host)进行通信&#xff0c;提供带外的方式查询服务器的状态和信息&#xff0c;并进行管理服务器。 OpenBMC是Linux Foundation的开源BMC项目&am…...

java 正则表达式匹配Matcher 类

Matcher 类 用法 在 Java 中&#xff0c;Matcher 类是用于匹配正则表达式的工具&#xff0c;而 group() 方法是 Matcher 类中的一个重要方法&#xff0c;用于提取匹配结果中的捕获组&#xff08;captured groups&#xff09;。以下是对 group() 方法的详细解释&#xff1a; 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(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、什么是CSS?二、基本语法规范三、CSS选择器3.1 标签选择器3.2 id选择器3.3 class选择器3.4 通配符选择器3.5 复合选择器 四、常用CSS样式4.1 color4.2 font…...

使用 concurrently 实现前后端一键启动

使用 concurrently 实现前后端一键启动 本文适合&#xff1a; 前后端分离项目&#xff08;如 React Node.js&#xff09;&#xff0c;希望通过一条命令同时启动前端和后端服务。 工具链&#xff1a; Node.js、npm、concurrently。 耗时&#xff1a; 3 分钟。 文章目录 使用 c…...

常见端口的攻击思路

端口号端口说明攻击方向21/22/69FTP/TFTP文件传输协议匿名上传/下载、嗅探、爆破2049NFS服务配置不当139Sanba服务爆破、远程代码执行389Ldap目录访问协议注入、匿名访问、弱口令22SSH远程连接爆破、SSH映射隧道搭建、文件传输23Telnet远程连接爆破、嗅探、弱口令3389RDP远程桌…...

大数据治理实战:架构、方法与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 大数据治理是确保数据质量、合规性和安全性的重要手段&#xff0c;尤其在数据驱动决策和人工智能应用日益普及的背景下&…...

忘记宝塔的访问地址怎么找

在linux中安装宝塔面板后会生成网址、账号和密码 如果网址忘记了那将进不去宝塔面板该怎么办呢&#xff1f; bt命令 我们输入 bt 命令的时候&#xff0c;是在根目录里面进行操作的。 / bt 我们根据自己的需要&#xff0c;选择对应的数字就可以了。 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 数…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...