天天看点

指针的思考

指针从几年前就开始接触到了,当时我的脑子里对指针没有概念,只知道它就像他的名字一样 它可以指向一个数据进行修改或者调用。结果确实如此,命名的人很有智慧。

听那些老一代的程序员所写的博客和论坛的评论,说这个东西是C语言的灵魂,如果运用不恰当会对程序造成极大的破坏,甚至造成内存的泄露。

从那之后对于指针我就会产生一种莫名的恐惧感,甚至看见它关于它的两个操作符号我也会心中产生一种反感。就是那个*与&操作符。

因此我尽量的用数组或者全局变量,忽略了指针。几乎每次的程序我完全不用指针,也发现这东西完全可以不用。程序里不用指针这个程序看起来简约、工整。

但是今年偶然间用到它的时候,发现我以前的恐惧和担心,都是错误的。

我以前自己写一写小的程序也就是按照自己的思路走的,包括整个程序的架构、函数封装等等。

 今年2014年,有一个同学想跟我一起设计一个基于VisualC++ 6.0平台下的一个Windows游戏,也就是当时比较有名的手机游戏2048,他是负责游戏的图像交互的,我就是后台那个给予他一切数据处理的头文件或者函数。为了能够更好的进行分工,他对我的要求就是能够把他的简单数据给我,我经过一系列的加工处理再把这些处理好的数据返还给他,后来为了能够更好地交互,想来想去,也就只有指针可以实现这个功能了。全局变量根本不可行,全局变量在他的电脑上,我这里只能做一些功能性的函数了。笔记:指针并非抽象概念,他是一种类型,就叫做指针类型,正如整形、浮点、布尔一样,只不过它只能储存其他变量的内存地址。它自己也占用内存。

指针有了数据内存地址以后,就可以修改这个内存地址上的数据,它简直太好用了。它甚至可以放到函数的参数里,基本就像一个绿色通道,对外面世界的东西进行访问、修改、操作等等,基本什么事情都能做。

 举个例子:

int Add(int a,int b)

{

        return (a + b);

}

用起来就是

 int a = 100,b = 100;

int c = Add(a,b);

定义整形a、b,并各赋值100,再把他们的之和相加给予c最后就是:

 a为100 b为100 c为200这个例子就是把外面的两个整形带到函数里相加,在返回一个整形,就是他们的之和。

看看指针能够怎么实现他的功能强大之处

int Add(int *a,int *b)

{

            int c = *a + *b;*a = 0,*b = 0;

            return c;

}

用起来就是

 int a = 100,b =100;

int c = Add(&a,&b);

结果发生了什么?

 就是:a为0 b为0 c为200

指针通过函数把外面世界的变量给改掉了。以前的的想法只有一种可能,就是把他们a、b设为全局变量进行修改现在不用了,a、b在哪里都无所谓,只要他们通过指针,把地址传入到函数里,就可以在函数里面对这些内存地址上的东西进行修改。

从那次运用过指针的强大以后,基本以后的任何程序就离不开指针了,静态变量甚至都可以不用了

因为指针可以指向空的内存地址,对空的内存地址进行合理的使用、修改、释放。

最后才发现数组也就是连续的一排空的内存地址,完全可以用指针进行动态开辟。

指针开辟内存所成为的数组,就是灵活的,他的大小是灵活多变的,他的地址甚至不用连续。

比如定义一个空的指针int *p;

好,这个指针里面没有地址,那么我给他分配10个长度为int长度的地址

 p = (int *)malloc(10*sizeof(int));

好了,这回指针开辟了10个连续的大小为int整形的内存(或者说内存地址)如何用呢??

完了,这个指针一小心成为了数组了^-^

怎么用呢,用法不是跟数组一样吗

p[10] = {1,2,3,4,5,6,7,8,9,0};

这样就给这个10内存地址存入内容了,也许会问,这不是成为数组了吗,对就是数组。它也是指针!!

 我们刚才发生了什么?那么整理一下思路,指针的思路。

 1.指针就是一个变量,它自己也占用内存。

 2.它里面储存的数据是内存地址。

 3.这个指针可以被操作,一元运算符*与&

 4.*<指针变量>代表获取、操作指针所指向/保存内存地址上的值

 5.&<任何变量>代表获取该变量的地址

图像法表示指针就是例如:

指针变量    内部存储的内存地址 :0xffffffff

                  自己占用的内存地址 :0x00000000

0xffffffff 自己所指向的地址

 0x00000000 自己占用内存地址(因为指针自己就是个变量)

 定义一个int*p;

那么这个指针里面没有储存东西int a =100;

&a就是用这个运算符取出a的内存地址p = &a;

把整形a的地址存到了指针p里面

这样*p就是100了

但是有很多人写指针的方式有点问题,会给很多初学的人造成了很大的麻烦!

就是这样定义 int *p;

虽然运行成功,但是没有可读性。其实这样是不对的,应该这样 int* p (整形指针p)

 *p不是调用内存地址上的值吗?所以int*p???

当然让人误解之前的那个函数就可以写成了

 int Add(int* a,int* b)

{

            int c = *a + *b;

            *a = 0,*b = 0;

return c;

}

参数里的指针定义就有强的的可读性为了更加明确变量的可读性,能让人认出这个是指针就在前面加一个小p,代表pointer

int Add(int* pa,int* pb)

{

            ........

}这样写未尝不可。

 这样指针分一下类别就有:int*型    float*型    double*型    char*型    void*型    struct*型    *<变量名>()型.........

                                                                                                                                                ^这个是函数指针型

以后还有更多的指针用法。。。