从原理上理解C/C++指针的优点
一 概述
在学习C语言特性时,理解指针始终是一道坎,很多人对指针有时代表地址有时代表数据表示很难理解,畏惧使用指针。在工作中凡是涉及C/C++就一定会使用指针,学懂指针很有必要。
二 指针的主要作用
指针是变量 32位系统下占用4个字节、用来表示或者存储变量的地址,通过取值运算符(*)将返回这个地址对应的变量值。
参数传递 C中函数调用是按值传递的,传入参数在子函数中只是一个初值相等的临时变量,无法对传入参数作任何改动。实际编程中经常要改动传入参数的值,通过传递指针的形式就可以直接在内存中修改传入参数的值,减少内存消耗提升程序效率。
构建数据结构 利用指针可以表示数据结构,例如数组、链表、简化代码冗余,可以直接操作内存数据,提升程序的性能。
2.1 指针是什么?
在计算机里面有一个核心硬件设备叫做内存,程序在运行的时候在会给在代码里面定义的每一个变量都会分配一个内存单元用来存储变量的值,每个内存单元都有一个地址类似于家里的门牌号,通过这个”门牌号”就可以找到这个变量的值。
指针变量里面存储的就是其它变量的地址,例如下图中a是一个指针变量它的地址(”门牌号“)是0002,这个地址对应的存储单元里面存储的内容是1008。根据存储地址1008与变量之间的映射关系,很容易看出指针a指向来指针变量b,通过取值运算符号*a就可以得到变量b在存储器里面存储的内容。在32位体系下,每个变量的地址只需要4个字节就可以表示所以任何指针变量只占用4个字节,即使是指向结构体变量的指针也只占用4个字节、所以使用指针变量作为函数参数可以充分节省内存空间、减少内存拷贝。
三 指针用于参数传递的优点
3.1 现在有一种场景,我们需要实现一个对2个局部变量进行交换的函数。
如果函数不使用指针,根据C/C++函数传值的特点函数参数只是局部变量a、b的一个拷贝。change_number函数内部交换的是函数参数A、B的值,对于a、b的值没有任何改变。
对变量a、b调用函数change_number()之后的运行结果如下,变量a、b交换失败。
3.2 如果函数使用指针变量作为参数,根据C/C++函数传值的特点函数参数传递的是局部变量a、b地址一个拷贝。
在函数change_number(int*, int*)输出指针变量的值可以得到变量a、b的地址,根据指针的定义*a就可以得到main函数内局部变量a的值,因此我们把*a和*b的值进行对换其实也就是把main函数内的变量a、b的值进行对换,从实现通过调用函数实现数据交换的目的。
对变量a、b调用函数change_number()进行交换后,程序运行结果如下,变量a、b交换成功。
四 指针与数据结构
指针变量与数组、结构体变量一起使用可以记录数据项之间的关系,形成链表、栈、二叉树这些数据结构处理复杂问题。
对于链表这种数据结构,开发者可以通过在第一个数据的内部表示中包含指向下一个数据项的指针,来说明这两个数据项之间有概念上的顺序关系。