指针一直是学习C语言的一个重点与难点。只有熟练地掌握了指针,才可以说掌握了C语言,c语言的最吸引人的地方也是指针,因为它可以任意地操作内存,编写程序中有着极大地*空间,因此,也有人说指针是C语言的灵魂。
指针分析:
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指
针所指向的内存区、指针本身所占据的内存区。
指针的类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型
指针所指向的类型:把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针
所指向的类型(在指针的算术运算中,指针所指向的类型有很大的作用)指针所指向的内存区:从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。(一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址)指针本身所占据的内存区:用函数sizeof(指针的类型)可以测出指针本身所占据的内存区(在32位平台里,指针本身占据了4个字节的长度)
v 指针事实上是一种数据类型,和int 基本类型一样。
v 指针也是一种变量,占有内存空间,保存的是内存地址。
v 关于*p操作
① 在声明指针中,“*”号表示所声明的变量是一个指针。
② 在指针使用时,“*”号表示操作指针所指向的内存空间中的值。
③ 当*p放在等号的左边时,相当于给内存赋值。
④ 当*p放在等号的右边时,相当于从内存中获取值。
Int *p=NULL;//声明p是一个指针变量 Int i=3,j=0; p=&i;//指向i所在内存 *p=5;//将p所指的内存的值改变为5,此时变量i的值也是5 j=*p;//将*p把指的内存空间的值(i的值)赋值给 |
v 指针变量和它所指向的内存块是两个不同的概念。
v 指针的数据类型是指它所指向的内存空间的数据类型。当指针步长自加的时候,是根据所指向的内存的数据类型来确定的。
若在32位的系统上,一个指向整型数据的指针,自加的话,是加4.
v 通过指针来改变变量的值是指针的一个重要应用。这是指针作为函数参数的精华。
v 数组作函数参数的时候会退化为一个指针
Swap(int*a,int *b) { Int p = *a; *a = *b; *b = p; }//这样可以将实参的值也改变。 |
关于解决野指针的方案:
① 定义指针时,把指针变量赋值为null;
② 释放内存时,先判断指针变量是否为null;
③ 释放内存完毕后,把指针变量重新赋值为null
指针的算术运算:
① 指针和整数进行加减:一个指针p加(减)一个整数n后,结果是一个新的指针p,p的类型 和p 的类型相同,p 所指向的类型和p所指向的类型也相同,p的值将比p的值增加(减少) 了n 乘sizeof(p所指向的类型)个字节。
② 指针和指针进行加减:两个指针不能进行加法运算,这是非法操作;两个 指针可以进行减法操作,但 必须类型相同,一般用在数组方面
运算符&和*:
&是取地址运算符,*是间接运算符。&a的运算结果是一个指针,指针的类型是a的类型加个*, 指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。*p的运算结果就五花八门 了,总之*p 的结果是p 所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的 地址是p所指向的地址。
感受:
当然指针不是这么简单,还涉及很多如:结构体与指针,数组与指针,迭代器与指针等等,并非三言两语就能讲明白,上边总结的仅仅是一些基础的问题进行简单的描述。我们要舍得花费时间在这个上边,这样我们才会在编程这一条路走的更顺、更远。用以后用到指针的地方很多,虽然指针有点难但他真的很重要。