指针的思考

来源:互联网 发布:数码印刷软件 编辑:程序博客网 时间:2024/05/01 13:39
指针从几年前就开始接触到了,当时我的脑子里对指针没有概念,只知道它就像他的名字一样它可以指向一个数据进行修改或者调用。结果确实如此,命名的人很有智慧。
听那些老一代的程序员所写的博客和论坛的评论,说这个东西是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);
定义整形
ab,并各赋值100,再把他们的之和相加给予c最后就是:
 
a100 b100 c200这个例子就是把外面的两个整形带到函数里相加,在返回一个整形,就是他们的之和。
看看指针能够怎么实现他的功能强大之处

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);
结果发生了什么?
 
就是:a0 b0 c200
指针通过函数把外面世界的变量给改掉了。以前的的想法只有一种可能,就是把他们ab设为全局变量进行修改现在不用了,ab在哪里都无所谓,只要他们通过指针,把地址传入到函数里,就可以在函数里面对这些内存地址上的东西进行修改。

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


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


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

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

比如定义一个空的指针
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*    *<变量名>().........
                                                                                                                                                ^这个是函数指针型
以后还有更多的指针用法。。。
0 0