C语言为什么高效?因为C语言有指针。指针是C语言的精华,同时也是C语言的难点,很多人一学到指针就表示头大,指针的指向往往把人搞得晕头转向,甚至有的人为了避免使用指针居然不惜多写几十行代码,无疑增加了工程量,也降低了效率。那么指针到底是什么呢?又该怎么理解呢?这里我们先说说数据的存储。
在计算机中,数据存储的位置有两个,一个是硬盘,一个是内存,计算机一系列操作都是在内存上进行的。在写C语言程序时,所定义的变量按照不同的类型分别存放在栈、堆、常量存储区、自由存储区、全局/静态存储区。这里就拿栈区来说,局部变量存放在栈区,那么栈就会分给这个变量一段空间来放置这个变量,这个空间有一个地址与之对应,通过这个地址便可访问这个空间中存放的变量。这就好比你去宾馆住宿,前台会分给你一个房间,你就住在这个房间里,当你的朋友来找你时,就问前台你的房间号是多少,他就会根据这个房间号找到你,房间号就是你的地址,来找你就是访问。
程序在编译过程中,编译器在栈上开辟一个该变量类型大小的空间,这段空间的地址是0000000A(也可以是其他的,因为是随机分配的),然后再将变量a存放进去。这个地址就是一个指针,指针是变量,只是这个变量存的是地址,好比int a=10,a是一个变量,a中存放的是10。指针的用法如下:
int a=10;
int *ptr=&a;
因为指针是一个变量,所以可以改变指针的指向,使用指针时,就像使用其他变量一样,使用地址就像使用变量的值一样,只要按照这个思路去思考程序,就再也不会受到指针指向所引起的误扰了。
当我们访问这个数据时,只需对地址进行解引用即可,解引用的过程就是你的朋友根据房间号来找你。ptr中存放的是a的地址,*ptr就对ptr进行了解引用操作,*ptr的值为10,。同样我们可以对ptr解引用后给它重新赋值,这也就改变了变量a的值。这就好比宾馆服务员根据房间号找到你说,我们不做你生意了,请你搬出去,当你搬走时,服务员又让另一位客人住了进去。a的值在发生变化,好比现在这间房住的人的身份变了,但住的都是人。
指针不可怕,多尝试着使用它,你就会慢慢明白它的内涵,当你真正熟练掌握了指针,那么你就可以称之为c语言大师了,目前我也只是略懂个皮毛而已,灵活运用指针还很遥远,仍需努力。