第八章:善于利用指针

来源:互联网 发布:太原207所知乎 编辑:程序博客网 时间:2024/05/16 13:47

      指针一直是学习C语言的一个重点与难点。只有熟练地掌握了指针,才可以说掌握了C语言c语言的最吸引人的地方也是指针,因为它可以任意地操作内存,编写程序中有着极大地自由空间,因此,也有人说指针是C语言的灵魂。
指针分析

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。

要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指

针所指向的内存区、指针本身所占据的内存区。

指针的类型:把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型

指针所指向的类型:把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针

所指向的类型(在指针的算术运算中,指针所指向的类型有很大的作用)指针所指向的内存区:从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。(一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址)指针本身所占据的内存区:用函数sizeof(指针的类型)可以测出指针本身所占据的内存区(在32平台里,指针本身占据了4个字节的长度)

指针事实上是一种数据类型,和int 基本类型一样。

指针也是一种变量,占有内存空间,保存的是内存地址。

关于*p操作

① 在声明指针中,“*”号表示所声明的变量是一个指针。

② 在指针使用时,“*”号表示操作指针所指向的内存空间中的值。

③ *p放在等号的左边时,相当于给内存赋值。

④ *p放在等号的右边时,相当于从内存中获取值。

  

Int  *p=NULL//声明p是一个指针变量  

Int  i=3j=0

p=&i//指向i所在内存 

*p=5//p所指的内存的值改变为5,此时变量i的值也是5  

j=*p//*p把指的内存空间的值(i的值)赋值给

 

指针变量和它所指向的内存块是两个不同的概念。

指针的数据类型是指它所指向的内存空间的数据类型。当指针步长自加的时候,是根据所指向的内存的数据类型来确定的。

若在32位的系统上,一个指向整型数据的指针,自加的话,是加4.

通过指针来改变变量的值是指针的一个重要应用。这是指针作为函数参数的精华

数组作函数参数的时候会退化为一个指针

  

Swap(int*a,int *b) 

{

Int  p = *a;

*a = *b;

*b = p; }//这样可以将实参的值也改变。

关于解决野指针的方案

① 定义指针时,把指针变量赋值为null;

② 释放内存时,先判断指针变量是否为null

③ 释放内存完毕后,把指针变量重新赋值为null

指针的算术运算

① 指针和整数进行加减:一个指针p()一个整数n后,结果是一个新的指针pp的类型 的类型相同,所指向的类型和p所指向的类型也相同,p的值将比p的值增加(减少) n sizeof(p所指向的类型)个字节。

② 指针和指针进行加减:两个指针不能进行加法运算,这是非法操作;两个 指针可以进行减法操作,但 必须类型相同,一般用在数组方面

运算符&*

&是取地址运算符,*是间接运算符。&a的运算结果是一个指针,指针的类型是a的类型加个* 指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。*p的运算结果就五花八门 了,总之*p 的结果是所指向的东西,这个东西有这些特点:它的类型p指向的类型,它所占用的 地址是p所指向的地址。

感受:

当然指针不是这么简单,还涉及很多如:结构体与指针,数组与指针,迭代器与指针等等,并非三言两语就能讲明白,上边总结的仅仅是一些基础的问题进行简单的描述。我们要舍得花费时间在这个上边,这样我们才会在编程这一条路走的更顺、更远。用以后用到指针的地方很多,虽然指针有点难但他真的很重要。