再学C语言38:指针操作
C提供了6种基本的指针操作
示例代码:
#include <stdio.h>int main(void)
{int arr[5] = {1, 2, 3, 4, 5};int * p1, *p2, *p3;p1 = arr; // 把一个地址赋给指针p2 = &arr[2]; // 把一个地址赋给指针printf("指针指向的地址,指针指向地址中存储的内容,指针本身的地址:\n");printf("p1 = %p, *p1 = %d, &p1 = %p\n", p1, *p1, &p1);// 指针加法printf("\n");p3 = p1 + 4;printf("增加指针值:\n");printf("p1 + 4 = %p, *(p1 + 4) = %d\n", p3, *p3);// 递增指针printf("\n");p1++;printf("p1递增后的值:\n");printf("p1 = %p, *p1 = %d, &p1 = %p\n", p1, *p1, &p1);// 递减指针printf("\n");p2--;printf("p2递减后的值:\n");printf("p2 = %p, *p2 = %d, &p2 = %p\n", p2, *p2, &p2);// p1和p2恢复为初始值printf("\n");--p1;++p2;printf("恢复为初始值后:\n");printf("p1 = %p, p2 = %p\n", p1, p2);// 一个指针减去另一个指针printf("\n");printf("指针2减指针1:\n");printf("p2 = %p, p1 = %p, p2 - p1 = %p\n", p2, p1, p2 - p1);// 一个指针减去一个整数printf("\n");printf("指针3减一个整数:\n");printf("p3 = %p, p3 - 2 = %p\n", p3, p3 - 2);return 0;
}
运行结果:

可以对指针变量执行的基本操作:
1)赋值:可以把一个地址赋给指针
通常使用数组名或地址运算符&进行地址赋值
2)求值或取值:使用预算符*可取出指针指向地址中存储的数值
3)取指针地址:指针变量同其他变量一样具有地址和数值,使用运算符&可以得到存储指针本身的地址
4)将一个整数加给指针:可以使用+运算符把一个整数加给指针,或者把一个指针加给一个整数
整数会和指针所指类型的字节数相乘,所得结果加到初始地址上
如果相加的结果超出了初始指针所指向的数组的范围,则会出现不确定结果
5)增加指针的值:通过加法或增量运算符
对指向某数组元素的指针做增量运算,会让指针指向该数组的下一个元素
6)从指针中减去一个数:可以使用-运算符从一个指针中减去一个整数,与将一个整数加给指针类似
7)减小指针的值:与增加指针的值类似
8)求差值:求出两个指针之间的差值
通常对分别指向同一数组内两个元素的指针求差值,获得元素之间的距离
差值的单位是相应类型的大小(如2个int的大小)
9)比较:使用关系运算符比较两个指针的值,前提是两个指针具有相同的类型
两种形式的减法:可以用一个指针减掉另一个指针得到一个整数;也可以从一个指针中减去一个整数得到一个指针
计算机不检查指针是否仍然指向某个数组元素;C保证指向数组元素的指针和指向数组后的第一个地址的指针都是有效的;如果指针在进行了增量或减量运算后超出了这个范围,后果将是未知的
可以对指向一个数组元素的指针进行取值运算,但不能对指向数组后的第一个地址的指针进行取值运算,尽管这样的指针是合法的
不要对未初始化的指针取值:
int *p; // 一个未初始化的指针
*p = 5; // 一个危害极大的赋值// 把数值5存储在p所指向的地址// 由于p没有被初始化,因此其值是随机的,不知道数值5会被存储到什么位置// 这个位置也许对系统危害不大// 但是也许会覆盖已有的程序数据或代码,甚至导致程序崩溃
当创建一个指针时,系统只分配了用于存储指针本身的内存空间,并不分配用于存储数据的内存空间
因此在使用指针之前,必须给其赋予一个已分配的内存地址,例如可以把一个已存在的变量地址赋给指针,或者使用函数malloc()函数分配内存
使用指针时一定要小心
指针的2个基本功能:
1)指针最基本的功能在于同函数交换信息;如果需要让被调函数修改调用函数中的变量,就必须使用指针
2)指针的另一个基本功能是用于处理数组的函数中
相关文章:
再学C语言38:指针操作
C提供了6种基本的指针操作 示例代码: #include <stdio.h>int main(void) {int arr[5] {1, 2, 3, 4, 5};int * p1, *p2, *p3;p1 arr; // 把一个地址赋给指针p2 &arr[2]; // 把一个地址赋给指针printf("指针指向的地址,指针指向地址中…...
【论文Word排版】使用多级列表设置论文序号
在Word中对论文进行排版 1.设置章节前面的序号 1.1 需求 通常情况下要求如下 一级标题“第一章 XXX”,然后是“1.1 研究意义”, “1.2 研究现状” 之前的处理方式都是手打,并没有借助word的多级列表实现。这次趁着写毕业论文研究了一下。…...
分支管理方案
背景 在工作的过程中,git管理方式已经成为每一个项目开发的基础,每个项目的开发都离不开git管理方式。 但是在使用的过程中,由于对git分支管理方案的了解不深,导致会出现分支管理不明确的情况。 本文主要是做科普作用ÿ…...
Allegro走线时如何自动关闭其它网络飞线显示操作指导
Allegro走线时如何自动关闭其它网络飞线显示操作指导 在做PCB设计的时候,尤其是在评估布线的时候,走某一个网络的时候,希望其它网络的飞线会被自动关闭,方便评估。 Allegro支持这个功能,如下图 走线前 走线后 具体操作如下 点击Route...
Linux中常用命令汇总二
Linux中常用命令汇总一文章地址:https://blog.csdn.net/u011837804/article/details/1289952531、时间日期类基本语法date [OPTION]... [FORMAT]选项说明选项说明-d<时间字符串>显示指定的“时间字符串”表示的时间,而非当前时间-s<日期时间>…...
【数据结构】排序算法
目录 1.理解排序 1.1 排序的概念 1.2 排序的运用场景 1.3 常见的排序算法 2.插入排序算法 2.1 直接插入排序 2.2 希尔排序 3.选择排序算法 3.1 直接选择排序 3.2 堆排序 4.交换排序算法 4.1 冒泡排序 4.2 快速排序 4.2.1 hoare 法 4.2.2 挖坑法 4.2.3 前…...
[MySQL]初识数据库
哈喽,大家好!我是保护小周ღ,本期为大家带来的是 MySQL 数据库,也是新的知识,首先我们会初步认识什么是数据库,什么是Mysql 数据库,以及我们 mysql 主要学什么,SQL 语句简单使用&…...
XXL-JOB分布式任务调度框架(二)-路由策略
文章目录1.引言2.任务详解2.1.执行器2.2.基础配置3.路由策略(第一个)-案例4.路由策略(最后一个)-案例5.轮询策略-案例7.分片广播任务1.引言 本篇文章承接上文《XXL-JOB分布式任务调度框架(一)-基础入门》,上一次和大家简单介绍了下 xxl-job 的由来以及使用方法&…...
Java_Maven:5. 把第三方 jar 包放入本地仓库或私服
目录 1 导入本地库 2 导入私服 3 参数说明 1 导入本地库 随便找一个 jar 包测试,可以先 CMD进入到 jar 包所在位置,运行 mvn install:install-file -DgroupIdcom.alibaba -DartifactIdfastjson -Dversion1.1.37-Dfile fastjson-1.1.37.jar -Dpackaging…...
【剑指offer】03~05. 数组中的数字(C# 实现)
文章目录前言03. 数组中重复的数字04. 二维数组中的查找05. 替换空格结语前言 😃 大家好,我是writer桑,这是自己整理的 C# 做题记录,方便自己学习的同时分享出来,感谢支持。 03. 数组中重复的数字 题目描述࿱…...
Docker入门教程
文章目录一、Docker概述1. 什么是容器技术?2. 什么是Docker3. 为什么要使用Docker4. Docker和虚拟机的对比5. Docker相关概念6. DockerHub7. Docker架构二、安装Docker1. 安装Docker2. 配置阿里云镜像加速三、Docker常用命令1. 帮助命令2. 镜像操作命令3. 容器操作命…...
I2C总线应用测试程序
参考链接:I2c协议 Linux I2C应用编程开发 问题背景 在工作中需要测试I2C总线的传输稳定性,需写一个测试程序通过读写从设备寄存器的值来验证数据传输稳定性。 站在cpu的角度来看,操作I2C外设实际上就是通过控制cpu中挂载该I2C外设的I2C控制…...
主从表的建立
//表查--病害id--主从表public static DataSet QueryGetQlgjDispdbdisidTABbyqidZC(string qid, string bwname){string SQLStringZ "select * from tl_qlsoft_cql_qlcheck_qlstye_bw a, tl_qlsoft_cql_qlcheck_qlstye_bw_gj b where a.chbwidb.chbwid and a.qli…...
Exporter介绍与指标数据,规范说明(更新中)
1.exporter是什么广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target,如下所示,Prometheus通过轮询的方式定期从这些target中获取样本数据:2.exporter的来源与分类从Exporter的来源上来讲&am…...
[Android Studio] Android Studio Virtual Device虚拟机的功能试用
🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic 发布安卓学习过程中遇到问题解决过程,希望我的解决方案可以对小伙伴们有帮助。 🚀write…...
华为OD机试 - 检查数组中是否存在满足规则的数组组合1(Python)
检查数组中是否存在满足规则的数组组合1 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满足要求的数 在同一行里依次输出规则里A B C的取值,用…...
深圳“托育”放大招!政府出钱帮你带娃啦!
工作忙得不可开交 难以照料孩子的起居 这个带娃难题常常让双职工家庭 感觉到头疼不已 一边是工作,一边是孩子 父母都上班,宝宝谁来带? 未来这个问题将迎刃而解! 因为政府要出钱帮你带娃啦! 近日,深圳市总工…...
服务间调用方式 OpenFeign 的介绍和使用
文章目录前言1、 RestTemplate1.1、通用方法 exchange1.2、RestTemplate 和 OpenFeign 的区别2、RPC 和 HTTP2.1、RPC 是什么2.2、RPC 调用过程示意图2.3、HTTP 是什么2.4、HTTP 调用过程示意图2.5、对比3 、OpenFeign3.1 、OpenFeign 常用注解3.2 、案例前言 Feign 停更了&am…...
从开始测试到年薪40W,我的自动化测试艰辛历程
我希望我的故事能够激励现在的软件测试人,尤其是还坚持在做“点点点”的测试人。 你可能会有疑问:“我也能做到这一点的可能性有多大?”因此,我会尽量把自己做决定和思考的过程讲得更具体一些,并尽量体现更多细节。 …...
《C++ Primer Plus》第17章:输入、输出和文件(1)
对C输入和输出(简称I/O)的讨论提出了一个问题。一方面,几乎每个程序都要使用输入和输出,因此了解如何使用它们是每个学习计算机语言的人面临的首要任务;另一方面,C使用了很多较为高级的语言特性来实现输入和…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
【Pandas】pandas DataFrame dropna
Pandas2.2 DataFrame Missing data handling 方法描述DataFrame.fillna([value, method, axis, …])用于填充 DataFrame 中的缺失值(NaN)DataFrame.backfill(*[, axis, inplace, …])用于**使用后向填充(即“下一个有效观测值”)…...
