计算机有一系列连续编号或者编址的存储单元(通常所说的内存),这些存储单元可以单个进行操作,也可以以连续成组的方式进行操纵。指针是能够存放一个地址的一组存储单元,指针指的就是内存地址,通常是4个(32位机器)或者8个(64位机器)字节。

     


     1.指针是引用数据类型,因为本身没有保存数据,只是保存了数据的地址,间接的找到内存中的数据。


     1-1、&,取地址运算符,用于获取一个对象的地址。


     例如,p = &i,是把变量i的地址赋值给p;


      1-2、*,间接寻址运算符,当*作用于指针时,表示访问指针所指向的对象。 


     例如,j = *p,表示把指针p所指向的对象赋值给访问j,相当于j = i;


&、*  > 算术运算符 > 关系运算符 > 相等性运算符 > 逻辑运算符


     例如,++*p等价于(*p)++




     3、指针变量,保存指针的变量;


     


     4、申明一个指针变量


     int* p


     int,int表示该指针变量指向的对象的数据类型是int型;


     *,在申明指针变量时用来表示这是一个指针类型的变量;


     p,指针变量名,存放对象的地址。


     


     5、指针的用法


     5-1、指针可以作为参数,传递变量的地址,相当于多个函数参数共享该变量的地址。


     值传递:将变量复制一份,相当于两个变量


     地址传递:相当于同一个变量,拥有相同的内存区域(地址)


     5-2、指针可以作为返回值,但是不要返回自动变量,因为局部变量的生命周期为函数开始到函数结束,当函数结束后,局部变量会自动销毁,此时返回的指针所指向的对象便不存在了,会导致野指针问题。


     5-3、指针可以运算,进行加整数、减整数、指针的比较和相减,但运算的单位由指针的类型决定


     例如,int类型指针+1,地址偏移量为4,因为int类型占4个字节;


                 char类型指针+1,地址便宜量为1,因为char类型站1个字节;




     6、指针的优点



     6-1、高效的参数传递,在函数的参数传递过程中,实参复制一份传递给形参,复制过程中需要消耗一定的资源,这时如果选择使用指针传递参数的地址,就有非常大的优势。



     6-2、对动态分配内存的支持,通过指针对动态开辟的内存空间进行访问,并通过指针实现内存的释放和回收。



     6-3、对链表的支持,指针是将链表结构中不连续的内存地址形成链的关键。



     



     7、指针可能带来的问题



     7-1、指针未初始化,在C语言中不会对指针指向空间的内容进行检查,如果指针没有初始化,使用该指针可能导致无法预测的后果,比如指针指向一块随机的内存区域。



     7-2、局部变量被回收,引起的野指针问题。当指针指向一个局部变量时,当一个函数运行结束后系统便自动销毁了局部变量并回收其内存空间,此时指针便指向了一个不存在的空间,形成野指针问题。



     7-3、指针改变引起内存泄露,例如:



int *p = malloc(sizeof(int) * 5);//分配5个sizeof(int)大小的地址
int i = 1;
p = &i;



     这段代码中,指针p首先指向由malloc()函数开辟的内存空间,随后p又被赋值为int变量i的地址,一开始由malloc()函数开辟的内存空间变再也无法访问,也无法释放,从而引起内存泄漏。



     7-4、指针越界,访问数组时超过数组边界引起程序异常终止。