指针,初学者的梦魇对于初学者,在学习c语言的过程中每每提到指针都会让无数人闻风散胆吧。因为在我们学c语言的时候很多人(包括学长或老师)可能都会告诉我们指针是c语言中最难的一部分,所以导致还没开始接触就劝退了一批人。确实,c语言的精华也在于此,这也是它之所以长盛不衰的原因。很多时候初学者之所以害怕使用指针是因为害怕去尝试,其实如果在初学阶段愿意去尝试,敢于去修改bug,这时你就会发现指针学起来也简单多了。
你是不是因为害怕搞混*(p+1)与*p+1,const int *p与int *const p,**p,&p等看起来就让人蒙圈的变量、符号,并且怎么记都似乎记不住?那就应该多去练习!在之前的内容中我也一直没有写这部分知识点,因为我自己觉得指针只要去使用它确实是没难度的,另外一个原因是,这种没难度似乎又只可意会不可言传,自己总结出来的话总是没有书籍中写的清晰,每个人基础不一样同样的话对不同人理解的程度又不同,所以这里还是希望初学者自己主动把这块硬骨头啃下去,我就提点我自己认证之内的技巧供大家参考。
从定义出发去理解指针这里对于指针的官方定义我就不做搬运了,所有讲解c语言的书本都少不了对指针的定义。如果需要权威的说明可以查看《c primer plus》这本经典书籍,其中还包含很多细节说明和举例应用,把它作为参考书再好不过了,我想我能描述出来的文字绝对比不上他书中写的专业详细。指针最简单的概念就是:它是程序运行过程中的一个内存地址。至于一些针对指针变量衍生出来的奇奇怪怪的的表达式实质上就是运算符优先级与结合规律的基础内容。如果区分不出来可以先复习运算符部分知识。我们都知道所有程序要跑起来都需要先加载到内存中,程序运行所需的数据都会根据程序指令进行动态分配。很多朋友平时可能会说,哎呀,我的电脑(手机)又卡死啦,这时候很大可能性就是你的电脑或手机内存被占满了,而不是硬盘(存储器)没有足够空间。当然如果你的磁盘空间不够,然后运行内存也消耗过多那活该你的机器被卡。
学习时该怎么样避免踩坑还是哪句话,多练习把坑踩平自然而就不会再踩坑了,这肯定是一句废话,学啥技术都可以这么说。我的建议就是善用编译器的调试功能和printf()函数,现在的编译器功能都是越来越完善的,在初学阶段使用程序调试功能可以让你少走很多弯路,结合打断点调试程序,单步执行,观察变量信息,哪里对点哪里,调多了你编程都会越来越有手感。当然,等你有一定经验之后,在项目开发过程中还是希望你不要过多的依赖调试功能。希望你对程序能够熟练到通过看代码就能发现逻辑是否正确。
至于初学者嘛,此时不用你还想啥时候用呢!另外一个很关键的的技巧就是多打印信息,当然也是要你到处都打印,一个变量都不落下的打印,如果你不想时不时的调试代码,那就选择这种方式,选择在关键的地方对关键的数据进行输出,这样你直接在控制或者串口助手中就能及时发现问题。当然采用这种方式在开发阶段还是比较实用的,如果在巧妙的结合一些宏定义语句进入功能调试的差不多之后就整体关闭输出就好了,即使日后出现bug需要再调试处理起来也是非常方便。所以以上两种方法用于练习指针操作对初学者来说也是再好不过了,总之我曾经就是这么练习的。
keil中怎么了解指针keil和常用的c语言编译器vs一样具备调试功能,所以在你不会的时候也是可以采用调试的办法仿真程序运行结果来达到学习指针的目的。下面举一个简单的例子来说明。
随便写一个逻辑上跑得通的例子程序,编译没问题之后点击debug即可。
#include #include unsigned int var1 = 0;unsigned int idata var2[] = {1,2,3,4};unsigned int data var3[] = {5,6,7};unsigned int var4[] = {8,9};unsigned int code var5[] = {10,11,12};unsigned int data *var6;unsigned int *var7;unsigned int *var8;unsigned int *var9;unsigned int *var10;//unsigned int *var11;void main(void){ var1 = 100; var2[0] = 101; var3[0] = 102; var4[0] = 103;// va5[0] = 104;//这是一条错误语句,存放于flash中的数据为只读 var6 = &var1; var7 = &var2; var8 = &var3; var9 = &var4; var10 = &var5;}在接下来弹出的窗口中就可以查看,哪些是指针的地址,以及其对应的值,都可以看的一目了然。
汇编中内存信息
这个办法学起来难度不比单纯的敲代码更有意义吗,即可以从底层了解单片机执行原理又可以了解代码的执行过程,我感觉这应该不会那么无聊吧。单片机只是一种微型的计算机放大到开发计算机程序也是一样的道理吧。
如果底层代码理解起来有一定的难度也可以添加变量到观察窗口进行单步测试,这样也一样直观明了。
变量观察窗口
笔记本电源适配器
华为云耀云服务器L实例:中小企业数字化升级的最佳选择
功率放大器的有哪些类型详细说明
NVIDIA即将发布全新AI技术及产品 加速计算机图形领域最新进展
浅谈开尔文四线法测试及测试夹具设计
单片机开发过程学习C语言指针知识
印刷电路板PCB的软硬结合设计有哪些好处
基于LM3524的低电流升压转换器电路
数字货币基金管理平台BFDChain介绍
罗贤龙:混合云时代,云光协同价值凸显
国家电网为提升电网弹性,应用“三强三优”模式实现精准管理
电路板抄板需要多少时间
基于NFC的电池管理系统(BMS)架构解析
虚拟和远程制作在影视行业中的发展状况
继比亚迪宋MPV后,比亚迪又将推出王朝概念车,号称比亚迪造车以来“最靓”的SUV
百度推出医疗大脑 利用智能医疗技术造福人类
一款可以用激光来发送指令的智能音箱
推荐一个Python超级好用的内置函数lambda
everspin生态系统和制造工艺创新
东芝面向汽车应用推出有刷电机预驱动IC