C语言指针初级

目录
一、什么是指针
二、指针和指针类型
三、野指针
1.野指针的成因:
2.如何规避野指针
四、指针运算
1.指针+-整数
2. 指针之间的加减
五、二级指针
六、指针数组
一个男人,到底要走多少的路,才能成为一个真正的男人
本专栏适用于有一定C语言基础并且还要继续学习的人
往期回顾:
C语言函数详解
C语言操作符详解
C语言实现扫雷及进阶
C语言实现三子棋
C语言实现猜数字游戏
C语言for循环详解
C语言初学可能会遇到的问题(一)
文章质量在努力提高中...
指针是C语言的精髓,用好它,将能真正发挥C语言的强大功能。博主已经将指针的基础用法为大家准备好,并富有大量图解,有需要学习的朋友可以收藏保存,也欢迎大家与博主讨论,后续将会推出C语言指针的进阶内容。
一、什么是指针
指针是内存中一个最小单元的编号,也就是地址。
通常口语中的指针,通常指的是指针变量,是用来存放内存地址的变量。
每一个变量的创建,编译器都会给它分配一块空间来存储,而变量在这些空间中以二进制补码的形式存储,不了解补码的可以去看C语言操作符详解中有详细介绍。每一块内存空间都有对应的地址编号,这些地址在内存中是连续的,像门牌号一样,指针就相当于日常生活中的门牌号,通过某人的门牌号,就可以找到这个人。同样,拿到了指向某个变量的指针,就可以通过解引用,找到这个变量,然后对这个变量进行操作。

那么如何将地址(指针)存入指针变量中呢

a为int型,占四个字节,&a是将a的第一个字节的地址存放在指针变量p中。
指针的大小:在32位平台是4个字节,在64位平台上是8个字节
二、指针和指针类型
指针类型的意义:决定了p指向的对象类型;p解引用时可以访问的对象的字节数;决定了指针+/-整数操作时的步长。
(1)指针指向的数据为啥类型,一般就将指针类型定义为啥类型,比如指针要指向一个整形变量,就将这个指针定义为int*
(2)解引用时可以访问的对象的字节数;如果有特殊要求的话,可以修改指针类型为与自己解引用时想访问的字节数相等的数据类型
例如,在解引用时想访问1个字节的内容,即可将指针类型定义为char*类型,在解引用时想访问4个字节的内容,即可将指针类型定义为int*
(3)指针加减整数时的步长;指针加1,跳过的字节数

三、野指针
野狗:就是没有主人的狗(大多数,只是个例子);那么野指针,就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)
野指针是很‘危险’的,容易造成内存的非法访问。
1.野指针的成因:
(1) 指针未初始化
未初始化是指定义指针的时候,没有规定它指向的位置,如下面的指针p,那它现在就是一个野指针
(2)指针越界访问
#include <stdio.h>
int main()
{int arr[10] = {0};int *p = arr;int i = 0;for(i=0; i<=11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}
当i=11时,循环继续执行,指针p访问的范围已经超过来了数组arr的范围,因为数组外的值是未知的,而可以通过解引用p访问到数组外,所以当这次循环执行后,p就成了野指针。
(3)指针指向的空间释放
2.如何规避野指针
(1)指针初始化
如果在定义指针时不知道指针应该指向哪里,可以先初始化为空指针 int*p=NULL;初始化为空指针后,在后面使用这个指针时即可直接修改指针要指向的对象
(2)小心指针越界
用指针对数组进行操作时,要防止指针指向数组外的空间,指针所指对象超出数组范围后,这个指针就会变成野指针,变得不可控
(3)指针指向空间释放,及时置NULL
比如,当调用函数结束后,函数里面的局部变量会销毁,如果有指向这个局部变量的指针,那么这个指针就会变成野指针,当这个变量的空间释放后,及时将指针改为空指针
(5)避免返回局部变量的地址

指针p所指向的是test函数的返回值,为局部变量a的地址,但这个值所占用的空间已经在函数调用结束后还给了操作系统,所以再通过解引用指针p去访问这个变量就是非法的,即使如图解引用后可以访问的到,也是不允许的
(6)指针使用之前检查有效性

在每次使用指针时要先判断,这个指针是不是空指针,不是空指针,才能对这个指针进行操作
四、指针运算

1.指针+-整数
指针在+-整数时,向前/向后跳过指针对应的字节数,一般情况下,在数组中进行指针+-整数的情况会多一些,因为数组中的元素是连续存放的,且每一个元素的数据类型都相同,所以指针加1再解引用,就可以访问到下一个元素,指针减1在解引用也可以访问到上一个数组元素
这段代码可以清晰地看出数组与指针之间的关系

2. 指针之间的加减
指针减指针:得到两个指针之间的元素个数

p指向数组首元素,q指向数组最后一个元素,他们之间有9个元素,因此q-p=9
指针加指针,没有实际意义
五、二级指针
二级指针指向的对象是指针

*p可以找到a,那么**q也能找到a,先对*q找到p,再对p解引用找到a,即 *(*q),简写为**q
六、指针数组
真正的男人,主语是男人。那么指针数组,主语也就是数组,存放指针的数组

指针数组,就是存放指针的数组,即数组的每一个元素都是指针(地址)

将指针数组与二级指针结合起来


本文收录于水火莲花-C疑难专题 C语言学习专题
这两个专题可用于正在学习C语言,并且有一定基础的人,专栏持续免费更新中...
相关文章:
C语言指针初级
目录 一、什么是指针 二、指针和指针类型 三、野指针 1.野指针的成因: 2.如何规避野指针 四、指针运算 1.指针-整数 2. 指针之间的加减 五、二级指针 六、指针数组 一个男人,到底要走多少的路,才能成为一个真正的男人 本专栏适用于…...
C++的历史
C是一种广泛使用的编程语言。C于1983年由丹尼斯里奇(Dennis Ritchie)在贝尔实验室创造,它是C语言的扩展。C的设计初衷是为了提高代码的可重用性和可维护性。它允许开发人员使用面向对象编程(OOP)范例,这使得…...
保姆级别!!!--全网绝对教你会!!教你如何使用MQTTFX连接阿里云平台中的设备----下期告诉你如何创建!
本期需要下载的软件 MQttfx安装包,本人打包的-嵌入式文档类资源-CSDN文库 目录 第一步:建造阿里云设备 这个可以先忽略建造步骤,下期将提供步骤。 第二步:下载mqttfx软件 第三步:填写密钥信息进行连接 查看三元…...
Unexpected token ‘‘‘, “‘{“type“:““... is not valid JSON
尝试低代码schema解析JSON时报错,奇怪的是控制台解析正常,项目js执行JSON.parse()报错,简直无语了,,, 只能挨个检查了,首先温习了下JSON 的标准格式: JSON的合法符号:{(左大括号) }(右大括号) "(双引号) :(冒号) ,(逗号) [(左中括号) ](右中括号) JSON字符串:…...
关于C语言的杂记5
文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址:遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面:关于C语言这部分内容,…...
YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究
如果您正在进行目标检测项目,您很可能会选择众多 YOLO 模型中的一种。从现有的 YOLO 对象检测模型的数量来看,如何选择最佳模型是一个艰难的选择。 您可能会发现自己正在考虑: 选择哪种 YOLO 模型以获得最佳 FPS? CPU 与 GPU 的推理速度如何?选择哪种 GPU?微型、小型、…...
如何增加网站权重?有效提高网站权重的技巧方法
权重对于网站优化来说非常的重要,那什么是网站权重呢?网站权重是指搜索引擎给网站(包括网页)赋予一定的权威值,对网站(含网页)权威的评估评价。一个网站权重越高,在搜索引擎所占的份…...
路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)
目录 0 专栏介绍1 什么是RRT算法?2 图解RRT算法原理3 算法仿真与实现3.1 ROS C++实现3.2 Python实现3.3 Matlab实现0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);…...
【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI
文章目录 Stable Diffusion WebUI1. 安装1.1 下载 stable-diffusion-webui1.2 运行 webui.sh 2. 安装插件2.1 命令行安装2.2 extensions 安装2.3 常用插件 3. 使用教程3.1 页面布局3.3 快捷栏设置3.3.1 PNG Info3.3.2 Tagger Stable Diffusion WebUI 1. 安装 1.1 下载 stable…...
Python篇——数据结构与算法(第二部分)
目录 二、排序算法(承接第一部分) 1、堆排序算法——树的基础知识补充 2、树的基本概念 3、二叉树基础知识 (1)满二叉树 (2)完全二叉树 (3)二叉树的存储方式(表示方式…...
人工智能之读懂CNN卷积神经网络
通过往期文章的分享,我们了解了神经网络的结构,一般分为输入层,隐藏层,输出层 TensorFlow神经网络 那什么是卷积神经网络那,这就要我们追溯一下人类识别图像的原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现…...
go手写Redis(1)之协议说明
手写Redis 参考大佬的go实现redis,自己实现一个简单版本的用于学习go以及网络编程相关 https://github.com/HDT3213/godis https://coding.imooc.com/class/576.html #慕课网课程 源码地址: https://gitee.com/haijun1998/go_redis RESP协议 Redis Ser…...
Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?
目录 一图胜万言!! 解释说明 1. hadoop 2. hive 3. hbase 总结 一图胜万言!! 解释说明 1. hadoop 它是一个分布式计算分布式文件系统,前者其实就是 MapReduce,后者是 HDFS 。后者可以独立运行&…...
羽毛球中级提高班课后总结
2023.3.28第一课 🏸️四点对角线步伐练习🏸️ 1️⃣每一次接球一定要有启动步,脚跟离地; 2️⃣两边上网都是先迈右腿,加一个并步,最后一步大迈步,脚跟先落地; 3️⃣右边上网脚尖朝…...
多维时序预测 | Matlab基于最小二乘支持向量机LSSVM多维时间序列预测,LSSVM多变量时间序列预测
文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 基于最小二乘支持向量机LSSVM多维时间序列预测LSSVM多变量时间序列预测,matlab代码 评价指标包括:MAPE、MAE、RMSE和R2等,代码质量极高,...
KDZK-F水轮发电机转子测试仪
一、产品概述 KDZK-F水轮发电机转子测试仪是判断发电机转子绕组有无匝间短路的专用仪器,可以自动、手动(单向或双向)测量转子绕组的电压、电流、阻抗、功率、相位角等参数。 二、功能与特点 旋转鼠标,操作更方便。 可选择快速的…...
I2C通信协议原理和MPU6050
一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信,则每个设备得需要两组窗口,为3组相互独立的窗口通讯 为解决这个问题:设计了总线通讯,有多种,I2C为其中一种 二、I2C通信 (1&#…...
3.5 RDD持久化机制
一、RDD持久化 1、不采用持久化操作 查看要操作的HDFS文件 以集群模式启动Spark Shell 按照图示进行操作,得RDD4和RDD5 查看RDD4内容,会从RDD1到RDD2到RDD3到RDD4跑一趟 显示RDD5内容,也会从RDD1到RDD2到RDD3到RDD5跑一趟 2、采用持久化…...
Nginx(四)
部署LNMP架构动态网站WordPress LNMPLinuxNginxMySQLPhp 环境 192.168.29.141centos8Nginx1.24.0192.168.29.142centos8MySQL8.0.33192.168.29.143centos8Php7.2.24 关闭firewalld systemctl stop firewalld systemctl disable firewalld 关闭selinux setenforce 0 sed -ir…...
【fps系统重构】-观察cpu、memroy、io -iostat
当您使用iostat命令监控磁盘I/O情况时,可以查看以下指标: rrqm/s:每秒发生的读请求被合并的次数。如果该指标很低,说明读请求较少或未被合并,可能会导致磁盘I/O负载过重。wrqm/s:每秒发生的写请求被合并的…...
动态模型避坑指南:从事件脚本到状态图的5个常见错误及解决方法
动态模型避坑指南:从事件脚本到状态图的5个常见错误及解决方法 在交互式系统开发中,动态模型是连接用户需求与技术实现的关键桥梁。许多中高级开发者虽然掌握了UML工具的基本操作,却在真实项目交付时频繁遭遇状态机失控、事件响应异常等"…...
打卡信奥刷题(3076)用C++实现信奥题 P7015 [CERC2013] Crane
P7015 [CERC2013] Crane 题目描述 有 nnn 个箱子等着装上船。箱子的编号是 a1,a2,⋯ ,ana_1,a_2,\cdots,a_na1,a2,⋯,an。你的工作是通过若干次交换,将它们从小到大排列。你每次可以选择一个区间,将它的前半部分与后半部分交换,两半内…...
从相位差到厘米级精度:深入解析蓝牙6.0 CS中PBR公式的推导与验证
1. 蓝牙6.0 CS技术中的相位测距原理 蓝牙6.0引入的信道探测(CS)功能将定位精度提升到了厘米级,这主要得益于其采用的相位测距法(PBR)。想象一下,这就像用无线电波玩"激光测距",只不过我们用的是相位差而不是光脉冲。在实际操作中&a…...
Docker+宝塔:零基础在Mac上快速搭建PHP开发环境
1. 为什么选择Docker宝塔组合? 作为一个在Mac上折腾过各种开发环境的老手,我强烈推荐Docker宝塔这个黄金组合。你可能听说过宝塔面板在Linux服务器上的强大功能,但官方并没有提供Mac版本。这时候Docker就像个魔术师,能让我们在Mac…...
终极指南:@ngx-translate/core与懒加载模块的完美结合方案
终极指南:ngx-translate/core与懒加载模块的完美结合方案 【免费下载链接】core The internationalization (i18n) library for Angular 项目地址: https://gitcode.com/gh_mirrors/core81/core ngx-translate/core是Angular生态中最流行的国际化(i18n)库&am…...
coze-loop快速体验:粘贴代码选择优化目标,AI自动完成
coze-loop快速体验:粘贴代码选择优化目标,AI自动完成 如果你写过代码,肯定有过这样的经历:写完一段代码后总觉得不够完美,想优化却不知道从何下手。是应该追求更快的运行速度,还是让代码更容易读懂&#x…...
nli-distilroberta-base惊艳效果:支持动态max_length配置,兼顾长文本与低延迟需求
nli-distilroberta-base惊艳效果:支持动态max_length配置,兼顾长文本与低延迟需求 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的逻辑关系。这个轻量级模型在保持…...
英雄联盟专业录像编辑革命:用League Director打造电影级游戏视频
英雄联盟专业录像编辑革命:用League Director打造电影级游戏视频 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirector …...
别再为YOLO模型分发发愁了!PyInstaller打包保姆级教程(含UI、权重文件处理)
YOLO模型分发终极方案:PyInstaller全流程实战指南 当你的YOLO模型在本地运行得风生水起时,如何让没有技术背景的同事或客户也能轻松使用?传统方法往往需要对方安装Python环境、配置依赖库,这个过程足以劝退90%的非技术人员。本文…...
38_一文讲清楚蓝牙协议栈和BLE协议
一、蓝牙协议栈概述1. 蓝牙协议栈的分类(1) 经典蓝牙协议栈(BR/EDR)a. 核心协议层i. 无线电层(Radio)⓵ 工作在 2.42.42.4 GHz 的 ISM 频段⓶ 采用跳频扩谱(FHSS)技术,每秒跳频 160016001600 次…...
