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

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.野指针的成因&#xff1a; 2.如何规避野指针 四、指针运算 1.指针-整数 2. 指针之间的加减 五、二级指针 六、指针数组 一个男人&#xff0c;到底要走多少的路&#xff0c;才能成为一个真正的男人 本专栏适用于…...

C++的历史

C是一种广泛使用的编程语言。C于1983年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;在贝尔实验室创造&#xff0c;它是C语言的扩展。C的设计初衷是为了提高代码的可重用性和可维护性。它允许开发人员使用面向对象编程&#xff08;OOP&#xff09;范例&#xff0c;这使得…...

保姆级别!!!--全网绝对教你会!!教你如何使用MQTTFX连接阿里云平台中的设备----下期告诉你如何创建!

本期需要下载的软件 MQttfx安装包&#xff0c;本人打包的-嵌入式文档类资源-CSDN文库 目录 第一步&#xff1a;建造阿里云设备 这个可以先忽略建造步骤&#xff0c;下期将提供步骤。 第二步&#xff1a;下载mqttfx软件 第三步&#xff1a;填写密钥信息进行连接 查看三元…...

Unexpected token ‘‘‘, “‘{“type“:““... is not valid JSON

尝试低代码schema解析JSON时报错,奇怪的是控制台解析正常,项目js执行JSON.parse()报错,简直无语了,,, 只能挨个检查了,首先温习了下JSON 的标准格式: JSON的合法符号:{(左大括号) }(右大括号) "(双引号) :(冒号) ,(逗号) [(左中括号) ](右中括号) JSON字符串:…...

关于C语言的杂记5

文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址&#xff1a;遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面&#xff1a;关于C语言这部分内容&#xff0c;…...

YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究

如果您正在进行目标检测项目,您很可能会选择众多 YOLO 模型中的一种。从现有的 YOLO 对象检测模型的数量来看,如何选择最佳模型是一个艰难的选择。 您可能会发现自己正在考虑: 选择哪种 YOLO 模型以获得最佳 FPS? CPU 与 GPU 的推理速度如何?选择哪种 GPU?微型、小型、…...

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要&#xff0c;那什么是网站权重呢&#xff1f;网站权重是指搜索引擎给网站&#xff08;包括网页&#xff09;赋予一定的权威值&#xff0c;对网站&#xff08;含网页&#xff09;权威的评估评价。一个网站权重越高&#xff0c;在搜索引擎所占的份…...

路径规划 | 图解快速随机扩展树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篇——数据结构与算法(第二部分)

目录 二、排序算法&#xff08;承接第一部分&#xff09; 1、堆排序算法——树的基础知识补充 2、树的基本概念 3、二叉树基础知识 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉树的存储方式&#xff08;表示方式…...

人工智能之读懂CNN卷积神经网络

通过往期文章的分享,我们了解了神经网络的结构,一般分为输入层,隐藏层,输出层 TensorFlow神经网络 那什么是卷积神经网络那,这就要我们追溯一下人类识别图像的原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现…...

go手写Redis(1)之协议说明

手写Redis 参考大佬的go实现redis&#xff0c;自己实现一个简单版本的用于学习go以及网络编程相关 https://github.com/HDT3213/godis https://coding.imooc.com/class/576.html #慕课网课程 源码地址&#xff1a; https://gitee.com/haijun1998/go_redis RESP协议 Redis Ser…...

Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?

目录 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 2. hive 3. hbase 总结 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 它是一个分布式计算分布式文件系统&#xff0c;前者其实就是 MapReduce&#xff0c;后者是 HDFS 。后者可以独立运行&…...

羽毛球中级提高班课后总结

2023.3.28第一课 &#x1f3f8;️四点对角线步伐练习&#x1f3f8;️ 1️⃣每一次接球一定要有启动步&#xff0c;脚跟离地&#xff1b; 2️⃣两边上网都是先迈右腿&#xff0c;加一个并步&#xff0c;最后一步大迈步&#xff0c;脚跟先落地&#xff1b; 3️⃣右边上网脚尖朝…...

多维时序预测 | Matlab基于最小二乘支持向量机LSSVM多维时间序列预测,LSSVM多变量时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 基于最小二乘支持向量机LSSVM多维时间序列预测LSSVM多变量时间序列预测,matlab代码 评价指标包括:MAPE、MAE、RMSE和R2等,代码质量极高,...

KDZK-F水轮发电机转子测试仪

一、产品概述 KDZK-F水轮发电机转子测试仪是判断发电机转子绕组有无匝间短路的专用仪器&#xff0c;可以自动、手动&#xff08;单向或双向&#xff09;测量转子绕组的电压、电流、阻抗、功率、相位角等参数。 二、功能与特点 旋转鼠标&#xff0c;操作更方便。 可选择快速的…...

I2C通信协议原理和MPU6050

一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信&#xff0c;则每个设备得需要两组窗口&#xff0c;为3组相互独立的窗口通讯 为解决这个问题&#xff1a;设计了总线通讯&#xff0c;有多种&#xff0c;I2C为其中一种 二、I2C通信 &#xff08;1&#…...

3.5 RDD持久化机制

一、RDD持久化 1、不采用持久化操作 查看要操作的HDFS文件 以集群模式启动Spark Shell 按照图示进行操作&#xff0c;得RDD4和RDD5 查看RDD4内容&#xff0c;会从RDD1到RDD2到RDD3到RDD4跑一趟 显示RDD5内容&#xff0c;也会从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情况时&#xff0c;可以查看以下指标&#xff1a; rrqm/s&#xff1a;每秒发生的读请求被合并的次数。如果该指标很低&#xff0c;说明读请求较少或未被合并&#xff0c;可能会导致磁盘I/O负载过重。wrqm/s&#xff1a;每秒发生的写请求被合并的…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...