深入理解指针(3)--指针运算,野指针,assert断言

深入理解指针 这个时候即使出问题断言也不会有反应了。加上#define NDEBUG 指令,然后,重新编译程序,编译器就会禁用文件中所有的 assert()语句。如果程序又出现问题,可以移除这条#define NDEBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert()语句。assert()的缺点是,因为引入了额外的检查,增加了程序的运行时间。 阅读详情

指针运算

指针基本运算有三种,分别是:

  • 指针加减整数
  • 指针减指针
  • 指针的关系运算

指针±整数

因为数组是连续存放的,所以只要知道了首元素的地址就可以顺藤摸瓜,找到其他元素。

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	int* p = &arr[0];
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}

在这里插入图片描述
这里我们可以发现,通过指针加减一个整数可以实现指针的左右移动,而得到其他元素。
我们要注意代码中的sz的写法,是得到数组元素的常用的方法。因为我们可能有时候不知道数组大小,可以这样算出来。

指针减指针

指针减指针前提是两个指针指向同一块空间,得到的是两指针间的元素个数(绝对值)。

int main()
{
	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);//指针-指针
	printf("%d\n", &arr[0] - &arr[9]);//指针-指针
	//指针-指针的绝对值是指针和指针之间的元素个数
	char ch[6] = {0};
	printf("%d\n", &arr[9] - &ch[4]);//err
	return 0;
}

在这里插入图片描述

指针的关系运算

指针也是可以比较大小的,这就是指针的关系运算

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = &arr[0];
	while (p < arr + sz)//指针的关系元素
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

在这里插入图片描述

野指针

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

野指针成因

  1. 指针未初始化
int main()
{
	int* p;//未初始化,指向不明
	*p = 20;
	printf("%d\n", *p);

	return 0;
}
  1. 指针访问越界
int main()
{
    int arr[10] = { 0 };
    int* p = &arr[0];
    int i = 0;
    for (i = 0; i <= 11; i++)
    {
       //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
    }
    return 0;
}
  1. 指针指向空间释放
int* test()
{
    int n = 100;
    return &n;
}

int main()
{
    int* p = test();
    printf("%d\n", *p);
    return 0;
}

这里,n为局部变量,当test函数结束后n被销毁,空间回收,指针会成为野指针。

规避野指针

  1. 指针初始化:当明确知道指向位置时,直接赋值,不知道是赋值NULL。NULL值为0,这也是地值,但不可用,读写该地址会报错。
  2. 小心越界:当我们申请空间时,指针不能超出这个范围。
  3. 指针不用时,及时赋值NULL,使用前检查有效性。
  4. 避免返回局部变量地址。

assert断言

assert() 宏用法
注意:assert是宏,而不是函数。在C的assert.h头文件中。
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,
assert() 的用法很简单,我们只要传入一个表达式,它会计算这个表达式的结果:如果表达式的结果为“假”,assert() 会打印出断言失败的信息,并调用 abort() 函数终止程序的执行;如果表达式的结果为“真”,assert() 就什么也不做,程序继续往后执行。

int main()
{
	int a = 10;
	int* p = NULL;
	assert(p != NULL);
	//if (p == NULL)
	//{
		//printf("p == NULL, 是无效的指针\n");
		//return 1;
	//}
	*p = 20;
	printf("%d\n", a);
	return 0;
}

assert的作用就是注释的判断的作用。
当我们在使用一个指针时,可先用assert判断其是否可用。

今天,就先分享到这里,我们下期再见。

【C语言】指针(超详细!!一篇文章搞定!!!) 前言1. 深入理解指针(一)1.1 指针概括1.2 内存和地址1.3 指针变量和地址1.3.1 指针变量1.3.2 地址1.3.3 指针变量和地址的关系1.4 解引用操作符1.5 指针变量的大小1.6 指针变量类型的意义1.6.1 指针的解引用1.6.2 指针的简单加减1.6.3 void* 指针1.7 const 修饰指针1.7.1 const修饰变量1.7.2 const修饰指针变量1.8 指针运算1.8.1 指针 + 整数1.8.2 指针 - 指针1.8.3 指针的关系运算1.9 野指针1.9.1 阅读详情

相关推荐

C语言assert断言详解指针(3)

assert叫做“断言”什么是断言“呢?请看下面代码示例。int a=10;int b=20;assert(a==b)//如果不为真,就报错大家看到了吧,assert非常的霸道,通常assert在指针的时候常用到,接下来介绍一下函数原型和函数参数。如果你想要使用这个函数的话,你就要使用它对应的头文件assert.h,返回返回值是void,函数的参数是整形的表达式,如果表达式结果为真执行),如果为假程序终止assert通常用来测试代码测试运行和指针的运算往往比if语句更加简洁方便。

2301_79840227的博客 1076

深入理解指针(2):指针类型,野指针,const,空指针,assert断言,传值与传址

本文主要介绍了C语言中指针的相关概念和使用方法。首先讲解了void*指针的特点(泛型指针,可接受任意类型但无法运算),然后详细说明const修饰变量和指针的不同效果。接着阐述了指针运算规则(加减整数、指针相减等),并重点分析了野指针的成因及防范措施。此外还介绍了assert断言的使用场景,以及函数传值调用和传址调用的区别。最后通过实例展示了指针在实际编程中的应用技巧,帮助读者深入理解指针这一重要概念。

2502_91954313的博客 1078

手把手教你用差分放大电路搭建LC振荡器(实测频率误差分析)

本文通过一个差分放大电路搭建LC振荡器的实践案例,深入分析了实测频率与理论值产生显著误差的原因。核心在于共模电感的互感效应改变了谐振回路的等效电感,导致频率偏差。文章提供了从电路搭建、误差根源剖析到波形优化与稳定性提升的完整解决方案,帮助电子爱好者深入理解模拟电路的实际行为。

svm4gardener的博客 541

【C语言基础】:深入理解指针(二)

⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

书山有路勤为径,学海无涯苦作舟。 2502

Versal ACAP NoC实战:像理解计算机网络一样配置AXI NoC,打通PS与PL数据通路

本文深入探讨了Versal ACAP NoC的配置与优化,通过计算机网络类比解析NoC架构,详细介绍了在VD100开发板上配置AXI NoC实现PS与PL数据交互的实战步骤。文章涵盖NoC组件功能、Vivado配置技巧、性能优化方法及常见问题解决方案,帮助开发者高效打通Versal芯片的数据通路。

weixin_42665255的博客 291

IDEA类和方法注释模板设置(非常详细)

IDEA类和方法注释模板设置(非常详细)

黑桃A的博客 10万+

关于我、重生到500年前凭借C语言改变世界科技vlog.11——深入理解指针(1)

这一篇 vlog 开始我们将对C语言中极其重要的章节——指针,进行全方位的深入理解,指针几乎占据了C语言大部分重要代码,学会了指针可以实现更多复杂有效的功能,博主将用5篇vlog带领读者们进行你从未感受过的全面细致指针理解之旅!

Zero_VPN的博客 3428

【Arc GIS 零基础教学】土地利用类型图的绘制方法

​Hi,我是胡学长!今天教大家怎么利用Arc GIS 绘制土地利用类型图。土地利用类型图是表达土地资源的利用现状、地域差异和分类的专题地图。它是研究土地利用的重要工具和基础资料,同时也是土地利用调查研究的主要成果之一。在编制土地利用图的基础上,对当前利用的合理程度和存在的问题、进一步利用的潜力、合理利用的方向和途径,进行综合分析和评价。因此,土地利用图是调整土地利用结构,因地制宜进行农业、工矿业和交通布局、城镇建设、区域规划、国土整治、农业区划等的一项重要科学依据。......

一起来交流学习吧 1万+

深入理解指针1

本文主要介绍了C语言中指针的基本概念和使用方法。首先解释了内存和地址的关系,指出指针就是内存单元的编号。然后详细讲解了指针变量的定义、取地址操作符(&)和解引用操作符()的使用。文章还分析了指针变量的大小在不同平台下的差异,以及指针类型对解引用和指针运算的影响。特别介绍了void指针的泛型特性,并探讨了const修饰指针的两种不同作用。最后通过实例展示了指针的算术运算、指针相减和关系运算等操作。这些内容为理解C语言中指针的核心概念和基本应用提供了系统性的介绍。

meilindehuzi_a的博客 1799

微信小程序 - 最新详细实现跳转打开第三方网站方法流程及示例代码,在小程序内直接打开H5页面或微信公众号文章后台业务域名配置及下载校验文件上传服务器,嵌入外部网站跳转第三方h5网页(详细配置及代码)

微信小程序,打开第三方网站,放校验文件,怎么配置业务域名,后台配置,怎么打开外部没有关联的网站,小程序直接打开公众号文章,指定页面,跳转第三方url,跳转到外部网站,小程序跳转到任意外部网页,网站链接,跳转到其他网页(外部链接),小程序嵌入外部h5链接,校验文件怎么放到对方服务器上,要跳转到网站没权限放过去,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,别人不可能同意,

🏆 前端领域优质创作者 1万+

告别第三方控件!C#实现OPC UA客户端,对接工业设备超简单

C#实现OPC UA客户端无需依赖第三方商业控件,通过快速起步:通过NuGet安装,使用模拟器完成前期开发测试;复用性强:封装通用工具类,支持连接、读写、订阅等核心功能,可直接集成到各类上位机项目;界面友好:通过WinForm绑定工具类,实现可视化操作,适配工业现场人员使用;工业适配:支持安全配置、身份验证,联调步骤清晰,可快速对接西门子、欧姆龙等主流工业设备;稳定性高:具备资源释放、异常处理、线程安全UI更新等特性,满足工业7×24小时运行要求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1363

深入理解指针(2)——指针运算

形参是实参的一份临时拷贝,更改形参并不会影响实参

m0_71199350的博客 795

Python爬虫实战:携程旅游攻略爬取全流程解析(动态接口+反爬破解+异步爬取)

本文介绍了携程旅游攻略的爬取全流程,涵盖静态和动态页面抓取、异步请求、高级反爬策略以及数据存储和简单分析。增加用户评论和评分抓取结合NLP分析攻略文本情感与关键词建立旅游推荐系统自动化代理IP池和验证码识别模块。

2201_76125261的博客 2039

深入理解指针(1)

我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何⾼效的管理呢?其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。计算机中常⻅的单位(补充):⼀个⽐特位可以存储⼀个2进制的位1或者0在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针。

2402_83273954的博客 2219

应用商店评论分析实战:Python逆向工程破解Google Play加密接口与NLP建模

在移动互联网时代,应用商店中的用户评论成为了开发者优化应用、提升用户体验的重要依据。然而,Google Play等应用商店对评论数据进行了加密处理,直接爬取难度较大。本文将介绍如何使用Python逆向工程破解Google Play的加密接口,实现对应用商店评论的实时采集,并结合NLP(自然语言处理)技术进行情感分析和主题建模,为开发者提供有价值的数据支持。

u014481728的博客 1347

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入理解指针(2)

深入理解指针(2)带大家继续在指针的海洋中无尽遨游。

yang_xinxim的博客 843

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【深入理解指针1】

在指针类型中有一种特殊类型的指针是void*类型的指针,可以理解为没有具体类型的指针你,可以接收任意类型的地址。如果明确知道指针指向哪里就直接给指针赋值,如果不知道就给指针赋值NULL,NULL是语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写会报错。*pa的意思就是通过pa中存放的地址,找到指向的空间,*pa其实就是变量,所以*pa=0,这个操作符就是把a改成0。注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

xwcsdn9796的博客 2214

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深入理解C语言指针(一)| 从内存到传址调用,掌握指针的核心本质

本文系统讲解了C语言指针的核心概念与应用,从内存地址基础到指针操作技巧,再到实际编程中的安全实践。主要内容包括:1.指针本质:理解内存与地址的关系,掌握取地址(&)和解引用(*)操作;2.指针类型:学习不同类型指针的运算规则和权限控制;3.const修饰:掌握四种const指针的用法及其安全意义;4.指针运算:了解指针算术运算的规则和数组遍历技巧;5.野指针防范:分析野指针成因及预防措施;6.传址调用:通过指针实现函数间数据修改,解决值传递限制。文章强调指针是C语言的灵魂,也是构建高效程序的关键工具

小韩的博客 1787

深入理解指针(1)——从内存到指针的完整指南

指针是C语言的核心特性,本质是内存地址的容器。文章系统讲解了指针的底层原理(内存编址机制)、指针变量的声明与使用(解引用操作)、指针类型的作用(决定访问权限和运算步长)、const修饰指针的用法、指针运算规则(加减整数和关系运算)、野指针的危害与规避方法,以及assert断言的使用。最后通过传值调用与传址调用的对比,展示了指针在函数参数传递中的关键作用。理解这些基础概念是掌握指针编程的关键,也为后续学习指针与数组的关系打下基础。

CrawlerRenewal的博客 1034

【C语言】深入理解指针(1)

本文介绍了C语言中指针的基本概念和操作。主要内容包括:内存和地址的关系,指针变量与取地址操作符(&)的使用,指针类型对解引用和加减运算的影响,以及指针变量在不同平台下的大小差异。指针本质上存储内存地址,通过指针类型可以决定访问内存的权限范围。32位系统中指针占4字节,64位占8字节。理解指针有助于更灵活高效地操作内存数据。

qq_64809564的博客 2400

深入理解指针(1)--新手小白都能明白的指针解析

Hello!各位小伙伴们五一过的怎么样啊,是不是很开心啊,既然这么开心,我们来看看开心地学习一下C语言的指针吧好了,正片开始漏一起期待**深入理解指针(2)**吧,估计这两天在五一假期结束之前出,溜了溜了,我们明天或者后天再见吧!

2302_78420373的博客 990

深入理解指针(三)

深入理解指针第三期

wydyfg的博客 928

C_深入理解指针(一)——内存和地址、指针变量和地址、指针变量类型的意义、const修饰指针、指针运算、野指针、assert断言、指针的使用和传址调用

C_深入理解指针(一)——内存和地址、指针变量和地址、指针变量类型的意义、const修饰指针、指针运算、野指针、assert断言、指针的使用和传址调用

祯的博客 955

C语言-深入理解指针(1)

学习到指针部分开始内容可能对有些人不好理解,但是指针又是c语言中不可或缺、十分重要的一个部分。所以我将指针拆接成多个篇章,编写尽量详尽,让读者们更好理解,更容易听懂。

Become Mad的博客 1187
上一篇: 深入理解指针(2)--指针+-整数和const修饰
下一篇: 深入理解指针(4)--传值调用和传址调用
tidal_wave
博客等级 码龄3年 518粉丝 41原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值