指针(初阶2)“野指针以及指针运算”

目录

一.野指针

二.如何避免野指针

三.指针运算

1、指针+(-)整数

2、指针 - 指针

3、指针关系运算


       小编在这里声明一下,将某一块的知识点分为上中下或者1,2,3来编写不是为了增加小编的文章总量,也不是故意这样的,是小编个人认为在编写文章的时候如果把一个知识点,就比如指针全写在一篇文章中,那样只会导致读者难以找到想要的知识点。

一.野指针

1、未初始化:这是很多初学者容易犯的错误(本人也是这样),就是在写任何变量的时候不喜欢或者说是没有这个习惯去赋初值,从而会时不时导致程序无法运行!

比如:    int* p ;

              *p = 20 ;

上述代码就是没有初始化,所以指针变量 p 到底指向什么我们不知道,后面解引用p,让*p = 20 ,也就是错误的。(这是很经典的野指针)

2、越界访问:多见于数组中,如下面的代码:

这里我们发现,程序运行就会出错,倒也是能出现结果,但是弹出上述的窗口。

       原因很好理解,我们此处定义的是一个大小位10的数组,但是在for循环中循环了11次,所以也就越界了。

3、指针指向的空间释放:这个可能不太好理解

       举一个例子,有一天你去了宾馆,然后登记了一间房子,在你登记的时间内,这件房子你可以随意进出,但是第二天,到期了(也就是指向的空间释放了),这时候你再进入这件房子就不礼貌了!

二.如何避免野指针

1)养成一个初始化的习惯,不仅仅是此处的指针

(2)避免越界

(3)指针指向空间释放后及时的指向NULL(指向NULL代表是一个空指针,没有指向任何有效的内存空间)

(4)使用指针之前检查有效性

         使用 if(p!=NULL)

                 {

                     *p = 10;//这里很好理解,也就是如果这个指针不是空指针,那就让他随意的指向一块空间,这里的10可以是任何已知空间的常量或者变量或者数组等

                  }

三.指针运算

1、指针+(-)整数

如:

int main()
{
  int a[5] = {1, 2, 3, 4, 5};
  int* p = a;
  for(p = &a[0]; p < &a[5];)//这里有指针的关系运算
  {
    *p++ = 0;//这里就是指针自加(也就是指针加整数)
  }
}

这里我们发现这样确实将数组内的元素全都变为了0,且指针最后指向了一个任意值!(具体是如何指向的各位读者可以自己笔画推导一下!)

2、指针 - 指针

如 int a[5] = {1,2,3,4,5} ;

     int n = &a[4] - &a[0] ; //这里就是指针减指针,也就代表两指针间的元素个数

如下:模拟实现strlen函数(使用指针 - 指针)

int my_len(char *str)//使用指针作为形参,指向abc字符串的首地址
{
	char* sta = str;//代表sta指向最初str指向的空间(也就是a)
	while (*str != '\0')
	{
		str++;//str自加指向该字符串的最后的地址
	}
	return str - sta;//指针减指针,得出字符串长度
}
int main()
{
	int l = my_len("abc");//字符串“abc”传的是首地址
	printf("%d\n", l);
	return 0;
}

上图中说的已经很清楚了,这里不在赘述

3、指针关系运算

上文中已经涉及到指针的关系运算,也就是两个指针的比较

需要注意的是:c标准规定

        允许数组指针可以和该数组最后一个元素之后的内存位置比较,但不可以和第一个元素之前的空间位置比较!具体可以看下图理解

意思就是 pa 可以和 pc 比较,但不可以和 pb 比较!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/693980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【大模型】Ollama+open-webui/Anything LLM部署本地大模型构建RAG个人知识库教程(Mac)

目录 一、Ollama是什么&#xff1f; 二、如何在Mac上安装Ollama 1. 准备工作 2. 下载并安装Ollama 3. 运行Ollama 4. 安装和配置大型语言模型 5. 使用Ollama 三、安装open-webui 1. 准备工作 2. Open WebUI ⭐的主要特点 3. Docker安装OpenWebUI&#xff0c;拉去太慢…

quick4 - hackmyvm

简介 靶机名称&#xff1a;quick4 难度&#xff1a;简单 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmQuick4 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;quick4&#xff09;&#xff1a;192.168.56.104 跳板机IP(windows 11)&…

【OpenHarmony】ArkTS 语法基础 ⑤ ( ArkTS 状态管理 | @State 装饰器定义状态数据 | 使用状态数据渲染组件 )

文章目录 一、ArkTS 状态管理 - State 装饰器1、State 装饰器定义状态数据2、State 装饰器定义状态数据 - 示例分析3、使用 State 装饰器定义的状态数据渲染组件 - 示例分析 二、完整代码示例1、完整自定义组件代码示例2、展示效果 参考文档 : <HarmonyOS第一课>ArkTS开发…

2024年6月8日:极工度玩公司全球首发“竞技智慧,渔护海洋”竞渔棋,世界海洋日直播发布会圆满落幕

在纪念2024年世界海洋日之际&#xff0c;极工度玩公司举办了一场别具一格的全球益智游戏首发发布会&#xff0c;向世界彰显了其对海洋生态保护的坚定承诺与热忱。这场以“竞技智慧&#xff0c;渔护海洋”为主题的盛会&#xff0c;旨在为参与者带来创新的游戏体验&#xff0c;同…

归并排序法

归并排序法是典型的分治算法应用&#xff0c;1946年由冯.诺伊曼发明。 算法思路&#xff1a;归并排序算法有两个基本操作&#xff0c;一是分&#xff0c;也就是把原数组划分成两个子数组的过程&#xff0c;另一个是治&#xff0c;它将两个有序数组合并成一个更大的有序数组。 …

【SpringCloud学习笔记】Docker(中篇)

Docker 1. 自定义镜像 前面我们都是使用docker pull拉取仓库中现成的镜像&#xff0c;但是如果我们想要将一个Java应用程序构建成镜像然后部署应该怎么做呢&#xff1f;这个时候我们就需要自定义镜像了 **镜像&#xff1a;**本质上就是一堆文件的集合&#xff0c;包含了应用程…

!力扣102. 二叉树的层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] /*** Definition for…

PHP实现一个简单的接口签名方法以及思路分析

文章目录 签名生成说明签名生成示例代码签名校验示例代码 签名生成说明 B项目需要调用A项目的接口&#xff0c;由A项目为B项目分配 AccessKey 和 SecretKey&#xff0c;用于接口加密&#xff0c;确保不易被穷举&#xff0c;生成算法不易被猜测。 最终需要确保包含签名的参数只…

Letcode-Top 100二叉树专题

94. 二叉树的中序遍历 方法一&#xff1a;递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

机器学习——卷积神经网络

卷积神经网络CNN 多层感知机MLP的层数足够&#xff0c;理论上可以用其提取出二位特征&#xff0c;但是毕竟复杂&#xff0c;卷积神经网络就可以更合适的来提取高维的特征。 而卷积其实是一种运算 二维离散卷积的公式 可以看成g是一个图像的像素点&#xff0c;f是每个像素点对…

312. 戳气球

题目 有 n 个气球&#xff0c;编号为 0 到 n - 1&#xff0c;每个气球上都标有一个数字&#xff0c;这些数字存在数组 nums 中。 现在要求你戳破所有的气球。戳破第 i 个气球&#xff0c;你可以获得 nums[i - 1] * nums[i] * nums[i 1] 枚硬币。 这里的 i - 1 和 i 1 代表和…

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知 道它们的类别&#xff0c;还想得到它们在图像中的具体位置。在…

【Python】数据处理:OS目录文件操作

Python的os模块是一个用于与操作系统进行交互的标准库模块。它提供了丰富的功能来处理文件和目录、执行系统命令、获取和设置环境变量等。 工作目录操作 获取当前工作目录 os.getcwd()参数&#xff1a;无返回值&#xff1a;一个字符串&#xff0c;表示当前工作目录的路径。这…

算数运算符与表达式(打印被10整除的数)

打印100以内&#xff08;包含100&#xff09;能被10整除的正整数 #include <stdio.h>#define UPPER 100int main() {int i 1;while (i < UPPER)if (i % 10 0)printf("%d\n", i);return 0; } 自增运算符 i 用于递增变量 i 的值。在 while 循环中&#xf…

Word多级标题编号不连续、一级标题用大写数字二级以下用阿拉伯数字

Word多级标题编号不连续 &#xff1a; 一级标题用大写数字二级以下用阿拉伯数字&#xff1a;

Golang——gRPC与ProtoBuf介绍

一. 安装 1.1 gRPC简介 gRPC由google开发&#xff0c;是一款语言中立&#xff0c;平台中立&#xff0c;开源的远程过程调用系统。gRPC客户端和服务器可以在多种环境中运行和交互&#xff0c;例如用java写一个服务器端&#xff0c;可以用go语言写客户端调用。 1.2 gRPC与Protob…

Gitte的使用(Windows/Linux)

Gitte的使用&#xff08;Windows/Linux&#xff09; 一、Windows上使用Gitte1.下载程序2.在Gitte上创建远程仓库3.连接远程仓库4.推送文件到远程仓库 二、Linux上使用Gitte1.第一次从仓库上传1.1生成公钥1.2配置SSH公钥1.3新建一个仓库1.4配置用户名和邮箱在Linux中1.5创建仓库…

在vscode 中使用npm的问题

当我装了 npm和nodejs后 跑项目在 文件中cmd的话可以直接运行但是在 vscode 中运行的时候就会报一下错误 解决方法就是在 vscode 中吧 power shell换成cmd 来运行就行了

Java——简单图书管理系统

前言&#xff1a; 一、图书管理系统是什么样的&#xff1f;二、准备工作分析有哪些对象&#xff1f;画UML图 三、实现三大模块用户模块书架模块管理操作模块管理员操作有这些普通用户操作有这些 四、Test测试类五、拓展 哈喽&#xff0c;大家好&#xff0c;我是无敌小恐龙。 写…

C++输入输出与IO流

C 输入输出与I/O流 文章目录 C 输入输出与I/O流IO类型与基础特性概念与特性IO状态输出缓冲区 文件输入输出文件模式 string流IO处理中常用的函数及操作符综合练习与demo一、 创建文件并写入二、控制台输入数据并拆分存储三、读写电话簿 IO类型与基础特性 C11标准提供了几种IO处…