应学院要求,写了一篇指针的学习心得,顺便也写成博客发了吧… 以下内容可能比较水,如果有错误,请与我联系,并对此修改。
什么是指针
==先来说说我的理解,我把整个程序想象成一个豪宅,每个变量是这座豪宅的每个房间,而指针就是这么多房间中其中一个房间的门牌号。接下来是官方的定义==。 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。如下图所示:
左侧连续的十六进制编号就是内存地址,每个内存地址对应一个字节的内存空间。而指针变量保存的就是这个编号,也即内存地址。
为什么要学习指针
在C语言中,指针的使用非常广泛,因为使用指针往往可以生成更高效、更紧凑的代码。总的来说,使用指针有如下好处: 1)指针的使用使得不同区域的代码可以轻易的共享内存数据,这样可以使程序更为快速高效; 2)C语言中一些复杂的数据结构往往需要使用指针来构建,如链表、二叉树等; 3)C语言是传值调用,而有些操作传值调用是无法完成的,如通过被调函数修改调用函数的对象,但是这种操作可以由指针来完成,而且并不违背传值调用。
如何声明一个指针
指针的声明比普通变量的声明多了一个一元运算符“*”,而“*”是间接寻址或者间接引用运算符。如下图,p是一个指针,保存着一个地址,该地址指向内存中的一个变量,*p则会访问这个地址所指向的变量。
1 | int *p; // 声明一个 int 类型的指针 p |
==注意指针数组和数组指针的区别==
初始化指针
声明一个指针变量并不会自动分配任何内存,在对指针间接访问之前,指针必须要初始化,如下图所示:
1 | /* 方法1:使指针指向现有的内存 */ |
未初始化指针的后果:如果一个指针没有被初始化,那么程序不知道它会指向哪里,可能指向一个非法地址,这样会报错,“运气好的话”,会指向一个合法地址,或许程序会正常运行,但是这个指针所指向的地址的变量的值会被恶意修改,到时候电脑可能就……
NULL指针
NULL 指针是一个特殊的指针变量,本身是宏定义的,其本质上就是0,表示不指向任何内存的空指针。但是NULL在C和C++里的用法又是不一样的,就不多细说了。可参考这篇C/C++中对NULL的理解与总结。
指针的用法
在这里就简略描述一下:指针的运算、指针与数组、指针与结构、指针与函数等…可参考:c语言常见的几种指针用法。
总结
指针在计算机里充当着一个很重要的角色,我们要了解它,要弄懂它,我们要做豪宅的主人,不要做豪宅的客人!
参考: https://blog.csdn.net/soonfly/article/details/51131141 https://www.cnblogs.com/lulipro/p/7460206.html https://www.cnblogs.com/tongye/p/9650573.html
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2020/05/17/pointer/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!