51-指针_野指针,指针运算

51-1 野指针

51-1-1 什么是野指针

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

没有初始化

int main()
{
	int* p;
	//p没有初始化,就意味着没有明确的指向
	//一个局部变量不初始化的话,放的是随机值:0xcccccccc
	*p = 10;  //非法访问内存,这里的p就是野指针
	return 0;
}

指针越界访问

int main()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++)
	{
		*p = i;
		p++;
	}
	return 0;
}

i=10时,变成野指针

指针指向的空间释放

int* test()
{
	int a = 10;
	return &a;
}

int main()
{
	int* p = test();  //已经接收地址,但函数中的地址已经销毁
	return 0;
}

51-1-2 解决方案

1、指针初始化

2、小心指针越界

3、指针指向空间释放及时置NULL

4、避免返回局部变量的地址

5、指针使用之前检查有效性

初始化为具体值

int main()
{
	int a = 10;
	int* p = &a;
	*p = 20;
	return 0;
}

初始化为NULL

int main()
{
	int* p2 = NULL;
	*p2 = 100;
	return 0;
}

正确代码

int main()
{
	int* p3 = NULL;
	if (p3 != NULL)
	{
		*p3 = 100;
	}
	return 0;
}

51-2 指针运算

51-2-1 指针+-整数

#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	//指针+-整数:指针的关系运算
	for (vp = &values[0]; vp < &values[N_VALUES];)
	{
		*vp++ = 0;
		//相当于:
		//*vp=0;
		//vp++;
	}
	return 0;
}

*vp++与(*vp)++的区别:

*vp++:分为两步:*vp;vp++;

(*vp)++:对vp进行解引用再++,即对vp指向的内容++

为数组元素赋值的三种方法:

代码1:

int main()
{
	int arr[10] = {0};
	int sz = sizeof(arr[10]) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = 1;
	}
	return 0;
}

代码2:

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr[10]) / sizeof(arr[0]);
	int i = 0;
	int* p = arr;
	for (i = 0; i < sz; i++)
	{
		*p = 1;
		p++;
	}
	return 0;
}

代码3:

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr[10]) / sizeof(arr[0]);
	int i = 0;
	int* p = arr;
	for (i = 0; i < sz; i++)
	{
		*(p+i) = 1;
	}
	return 0;
}

51-2-2 指针-指针

问:下列代码的结果?

答:9

代码1:

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);
	return 0;
}

结果1:

代码2:

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", &arr[0] - &arr[9]);
	return 0;
}

结果2:

解析:

中间只隔9个元素

​​​​​​​

原因:|指针-指针|(绝对值)得到的是指针之间的元素个数

注:不是所有的指针都能相减,指向同一块空间的指针才能相减

使用场景举例:自己写一个写strlen函数

代码1 while循环

int my_strlen(char* str)
{
	int count = 0;
	while (*str!= '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char str[] = "abcdef";
	int len = strlen(str);
	printf("%d\n", len);
}

代码2 指针-指针

int my_strlen(char* str)
{
	char* str_start = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - str_start;
}
int main()
{
	char str[] = "abcdef";
	int len = strlen(str);
	printf("%d\n", len);
}

结果均为6

或许有uu会疑问,可以指针+指针吗?

我们通常不会这样用。就像我们经常用日期-日期算时间,但是没有用过日期+日期,没有意义

51-2-3 指针的关系运算

为数组元素赋值:

代码1

#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	for (vp = &values[N_VALUES]; vp > &values[0];)
	{
		*--vp = 0;
	}
	return 0;
}

代码2 

#define N_VALUES 5
int main()
{
	float values[N_VALUES];
	float* vp;
	for (vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
	{
		*vp = 0;
	}
	return 0;
}

实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。

标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

图解:

p1可以跟p3比较,不能跟p2比较 

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

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

相关文章

clickhouse 中的数组(array)和元组(Tuple)—— clickhouse 基础篇(二)

文章目录 数组判断是否为空计算数组长度获取数组元素判断某个元素是否存在数组切片数组元素展开数组元素去重删除连续重复元素连接多个数组数组倒序数组拍平数组元素映射数组元素过滤数组聚合分析计算数组交集计算数组并集计算数组差集SQL 子查询进行集合操作 元组创建元组获取…

八国多语言微盘微交易所系统源码 单控点控 K线完好

安装环境linux NGMySQL5.6PHP7.2&#xff08;函数全删&#xff09;pm2管理器&#xff08;node版本选择v12.20.0&#xff09; config/ database.php 修改数据库链接 设置运行目录 public 伪静态thinkphp

最有效的企业数据防泄漏手段 | 数据泄漏防护系统推荐

随意信息安全意识不断提高&#xff0c;企业纷纷寻求高效的数据防泄漏手段。在众多解决方案中&#xff0c;这五款软件各具特色&#xff0c;但它们的共同目标都是确保企业数据的安全性和保密性。 接下来&#xff0c;我们将逐一介绍这五款软件的特点和优势。 1、Ping 32 Ping32…

C中十进制转十六进制示例

uint8_t QR_code_RxBfr[255]{0}; uint8_t TouchCode[100];memcpy (&Sys.TouchCode[0], &QR_code_RxBfr[0], Sys.QR_code_Len);Str &Sys.TouchCode[TmpVble];Sys.Card_ID 0; while(0 ! isdigit(*Str)){Sys.Card_ID Sys.Card_ID*10 *Str - 0;Str;} 最后在通过以下…

【淘宝商品API接口】淘宝一件代发,如何找到便宜又靠谱的货源商品铺货到自己店铺?

电商商品API接口 对没有自己货源的淘宝小卖家来说&#xff0c;从1688等货源平台拿货做一件代发是最好的选择。不需要囤货&#xff0c;也不需要自己打包发货&#xff0c;投入小、风险低。 在大部分卖家眼里&#xff0c;1688上面的商品很贵&#xff0c;甚至比淘宝同行卖的都贵&…

Ceph集群RBD块存储:快照与Copy-on-Write克隆的基本操作

文章目录 1.RBD块存储镜像克隆概念2.copy-on-write克隆的基本使用2.1.在块存储中创建一个快照2.2.将快照配置成保护模式2.3.基于快照克隆出镜像2.4.使用克隆的镜像2.5.查看一个快照下有哪些克隆的镜像 1.RBD块存储镜像克隆概念 镜像克隆官方文档&#xff1a;https://docs.ceph…

Qt for android 添加自己的java包

java 包 目录 .pro 中添加 OTHER_FILES $$PWD/android/src/ScytheStudio \$$PWD/android/src/Serial 或 DISTFILES android/src/ScytheStudio \android/src/Serial \或(可以在Qt Creator中显示) DISTFILES android/src/ScytheStudio/*.java \android/src/Serial/*.java \

QQ沐个人引导页html源码

好看的QQ沐个人引导页html源码&#xff0c;鼠标移动滑出美丽的线条收缩特效&#xff0c;界面美观大气&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 …

【分享】3种方法取消PPT的“限制保护”

PPT如果设置了有密码的“只读方式”&#xff0c;每次打开PPT&#xff0c;都会出现对话框&#xff0c;提示需要输入密码才能修改文件&#xff0c;否则只能以“只读方式”打开。 以“只读方式”打开的PPT就会被限制&#xff0c;无法进行编辑修改等操作。那如果后续不需要“限制保…

Springboot阶段项目---《书城项目》

一 项目介绍 本项目采用集成开发平台IntelliJ IDEA开发了在线作业成绩统计系统的设计与实现&#xff0c;实现了图书商城系统的综合功能和图形界面的显示&#xff0c;可以根据每个用户登录系统后&#xff0c;动态展示书城首页图书&#xff0c;实现了分类还有分页查询&#xff0c…

MySQL -- 相关知识点

1.数据库相关介绍 数据库的选择通常取决于具体的应用需求&#xff0c;如性能、扩展性、数据一致性和易用性等因素。 1. 关系型数据库&#xff08;RDBMS&#xff09; MySQL&#xff1a; 广泛使用的开源数据库&#xff0c;支持大多数操作系统。强调易用性、灵活性和广泛的社区支…

Flutter Text导致A RenderFlex overflowed by xxx pixels on the right.

使用Row用来展示两个Text的时候页面出现如下异常,提示"A RenderFlex overflowed by xxx pixels on the right." The following assertion was thrown during layout: A RenderFlex overflowed by 4.8 pixels on the right.The relevant error-causing widget was:…

ClickHouse课件

列式存储数据库&#xff1a;hbase clickhouse 简介 ClickHouse入门 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;使用C语言编写&#xff0c;主要用于在线分析处理查询&#xff08;OLAP&#xff09;&#xff0c;能够使用…

K8S中YAML案例

目录 案例&#xff1a;自主式创建service并关联上面的pod 案例&#xff1a;部署redis 案例&#xff1a;部署myapp 案例&#xff1a;部署MySQL数据库 总结 1.K8S集群中访问流向 K8S集群外部&#xff1a;客户端——nodeIP&#xff1a;nodeport——通过target port——podIP…

【排序算法】堆排序(Heapsort)

✨✨✨专栏&#xff1a;排序算法 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 ​编辑 前言&#xff1a; 一、堆排序&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#xff1a; 算法稳定性&#xff1a; 二、升序的实现&#xff1a;通过建大堆实…

find 几招在 Linux 中高效地查找目录

1. 介绍 在 Linux 操作系统中&#xff0c;查找目录是一项常见的任务。无论是系统管理员还是普通用户&#xff0c;都可能需要查找特定的目录以执行各种操作&#xff0c;如导航文件系统、备份数据、删除文件等。Linux 提供了多种命令和工具来帮助我们在文件系统中快速找到目标目…

百度软件测试面试经历,期望薪资27K

一面 1、 请为百度搜索框设计测试用例&#xff1f; 2、百度设计框上线前需要进行那些测试&#xff1f; 界面测试&#xff0c;功能测试&#xff0c;性能测试&#xff0c;安全性测试&#xff0c;易用性测试&#xff0c;兼容性测试&#xff0c;UI测试。 3、如何查看http状态码…

高通 Android 12/13冻结屏幕

冻结屏幕很多第一次听到以为是Android一种异常现象&#xff0c;实则不然&#xff0c;就是防止用户在做一些非法操作导致问题防止安全漏洞问题。 1、主要通过用户行为比如禁止下拉状态栏和按键以及onTouch事件拦截等&#xff0c;不知道请看这篇文章&#xff08;Touch事件传递流…

WPF模板样式Style用法

在Windows Presentation Foundation (WPF) 中&#xff0c;样式&#xff08;Style&#xff09;和模板&#xff08;Template&#xff09;是创建丰富且可重用的UI元素的强大工具。样式允许你定义一组属性设置&#xff0c;这些设置可以应用于一个或多个控件&#xff0c;而模板则允许…

Flink-cdc更好的流式数据集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一种数据变更捕获技术&#xff0c;用于从数据源&#xff08;如数据库&#xff09;中捕获和处理数据的变更事件。CDC技术允许实时地捕获数据库中的增、删、改操作&#xff0c;将这些变更事件转化为流式数据&#xff0c;并能够…