当前位置: 首页 > 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;每秒发生的写请求被合并的…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...

计算机系统结构复习-名词解释2

1.定向&#xff1a;在某条指令产生计算结果之前&#xff0c;其他指令并不真正立即需要该计算结果&#xff0c;如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方&#xff0c;那么就可以避免停顿。 2.多级存储层次&#xff1a;由若干个采用不同实现技术的存储…...