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比较 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 插入数据的时候自动忽略重复数据

MySQL中插入数据&#xff0c;如果插入的数据在表中已经存在&#xff08;主键或者唯一键已存在&#xff09;&#xff0c;使用insert into语法的时候&#xff0c;如果遇到重复数据&#xff0c;会直接报错&#xff0c;导致事务回滚&#xff0c;所有插入数据&#xff0c;全部失败。…

TCP/IP体系模型简介

一、TCP/IP 概念 TCP&#xff08;Transmission Control Protocol 传输控制协议&#xff09;&#xff1a; 是一种面向连接的、可靠的传输层协议。通过三次握手建立连接&#xff0c;确保连接的可靠建立。对数据进行有序传输&#xff0c;并具有确认机制和重传机制来保证数据的完整…

SpringBoot多数据源启动出现循环依赖问题

在使用SpringBoot的项目中&#xff0c;如果是有使用多数据源&#xff0c;可能会存在启动时数据源循环依赖的报错&#xff0c;是因为使用了多数据源注入&#xff0c;和DataSourceAutoConfiguration数据源自动配置的DataSourceInitializerInvoker互相产生循环依赖导致。 这种错误…

03-01-Vue组件的定义和注册

前言 我们接着上一篇文章02-Vue实例的生命周期函数 来讲。 下一篇文章 03-02-Vue组件之间的传值 什么是组件 组件&#xff1a; 组件的出现&#xff0c;就是为了拆分Vue实例的代码量的&#xff0c;能够让我们以不同的组件&#xff0c;来划分不同的功能模块&#xff0c;将来我们…

Java_网络编程

网络编程 定义&#xff1a; 网络编程就是计算机跟计算机之间通过网络进行数据传输 常见的软件架构&#xff1a; 1.C/S&#xff08;Client/Server&#xff09;&#xff1a;客户端/服务器模式 2.B/S&#xff08;Browser/Server&#xff09;&#xff1a;浏览器/服务器模式 区别…

安全系列---入门

目录 xss注入问题Authenticator认证器 xss注入问题 现象&#xff1a;前端显示内容非预期原因&#xff1a;反射型注入和存储型注入&#xff0c;本质都是利用输入框输入一段js代码。解决&#xff1a;利用html的转义解析&#xff0c;当浏览器遇到HTML转义符时&#xff0c;它会将其…

深入理解MySQL:查询表的历史操作记录

摘要&#xff1a;在数据库管理中&#xff0c;了解如何查询表的历史操作记录对于追踪数据变更、审计数据以及恢复误操作至关重要。本文将深入探讨MySQL中查询表的历史操作记录的方法&#xff0c;并提供多个实例以帮助读者更好地理解和应用这一技术。 引言 在数据库管理中&#…

Kivy.garden.NavigationDrawer

totally copied from github opensource code. Just a translation and ideas with idividuals ideas to share its use for all people using chinese. Copyright © 2013 Alexander Taylor 开源免责免费使用声明: #Permission is hereby granted, free of charge, to any…

【SpringBoot项目开发】查看购物车和清空购物车实现

查看和清空购物车的注意事项&#xff1a; 需要查看登录用户购物车中所有的信息&#xff0c;但是请求参数中可以不包含用户id&#xff0c;因为请求时会附带一个token&#xff0c;从token中能解析到用户id。 return shoppingCartMapper.list(ShoppingCart.builder().userId(Bas…

GQL图查询语言:高效处理复杂图数据

GQL是一种新型的查询语言&#xff0c;它可以处理复杂图数据&#xff0c;以提供比传统 SQL更快、更高效的查询方式。GQL图查询语言具有可扩展性&#xff0c;可以使用最少的编程知识来访问图数据库。在本文中&#xff0c;我们将探讨 GQL的概念和实际使用案例。同时&#xff0c;我…

C++: 多态

目录 一、多态的概念 二、多态的定义及实现 2.1虚函数 2.2虚函数的重写 2.3多态的构成条件 2.4虚函数重写的两个例外 1.协变 2.析构函数的重写 2.5虚函数重写的实质 2.6override 和 final&#xff08;C11&#xff09; 1.final 2.override 2.7重载、覆盖&#xff0…

go语言之变量

go是静态类型语言&#xff0c;因此变量是具有明确类型的&#xff0c;编译器也会检查变量类型的正确性 我们从计算机系统的角度来讲&#xff0c;变量就是一段或者多段内存&#xff0c;用于存储数据 文章目录 变量声明标准格式简便格式不指定变量类型批量声明简短格式 匿名变量变…

http协议报文头部结构解释

http协议报文头部结构 请求报文 报文解释 请求报文由三部分组成&#xff1a;开始行、首部行、实体主体 开始行&#xff1a;请求方法&#xff08;get、post&#xff09;url版本 CRLE 方法描述GET请求指定页面信息&#xff0c;并返回实体主体HEAD类似get要求&#xff0c;只不…

WXML模板语法-条件渲染和列表渲染

一、条件渲染 1.wx:if 在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码块,也可以用wx:elif和wx:else来添加else判断 // pages/list/list.js Page({data: {type:1} })<!--pages/list/list.wxml--><view wx:if"{{type 1}}&…

504 Gateway Time-out

问题描述 做Excel导入的功能&#xff0c;由于Excel的数据比较多&#xff0c;需要做处理然后入库&#xff0c;数据量大概200万&#xff0c;所以毫无悬念的导入Excel接口调用超过了一分钟&#xff0c;并且报错&#xff1a;504 gateway timeout。 解决方案 nginx超时限制。路径…

与WAF的“相爱相杀”的RASP

用什么来保护Web应用的安全&#xff1f; 猜想大部分安全从业者都会回答&#xff1a;“WAF&#xff08;Web Application Firewall,应用程序防火墙&#xff09;。”不过RASP&#xff08;Runtime Application Self-Protection&#xff0c;应用运行时自我保护&#xff09;横空出世…

微信小程序-----基础加强(二)

能够知道如何安装和配置vant-weapp 组件库能够知道如何使用MobX实现全局数据共享能够知道如何对小程序的API 进行 Promise 化能够知道如何实现自定义tabBar 的效果 一.使用 npm 包 小程序对 npm 的支持与限制 目前&#xff0c;小程序中已经支持使用 npm 安装第三方包&#x…

采用Java语言开发的(云HIS医院系统源码+1+N模式,支撑运营,管理,决策多位一体)

采用Java语言开发的&#xff08;云HIS医院系统源码1N模式&#xff0c;支撑运营&#xff0c;管理&#xff0c;决策多位一体&#xff09; 是不是网页形式【B/S架构]才是云计算服务? 这是典型的误区! 只要符合上述描述的互联网服务都是云计算服务&#xff0c;并没有规定是网页…

东软联合福建省大数据集团打造“数据要素×医疗健康”服务新模式

5月23日&#xff0c;东软集团与福建省大数据集团有限公司在福州签订战略合作协议。 据「TMT星球」了解&#xff0c;双方将在健康医疗数据要素价值领域展开合作&#xff0c;通过大数据服务&#xff0c;赋能商业保险公司的产品设计和保险两核&#xff0c;打造“数据要素医疗健康…

安卓分身大师4.6.0解锁会员安卓14可用机型伪装双开多开

需登录解锁会员功能&#xff0c;除了加速进入不能&#xff0c; 其他主要功能都是可以使用&#xff0c;由于验证较多一些功能需要特定操作使用&#xff0c;进行伪装时请不要直接伪装&#xff0c;先生成成功后再进行自定义伪装&#xff01;链接&#xff1a;https://pan.baidu.com…