(1)可以提高程序的编译效率和执行速度,使程序更加简洁。
(2)通过指针被调用函数可以向调用函数处返回除正常的返回值之外的其他数据,从而实现两者间的双向通信。
(3)利用指针可以实现动态内存分配。
(4)指针还用于表示和实现各种复杂的数据结构,从而为编写出更加高质量的程序奠定基础。
(5)利用指针可以直接操纵内存地址,从而可以完成和汇编语言类似的工作。
(6)更容易实现函数的编写和调用
C语言中的指针
通过指针来分配一个地址
*(地址),是去读地址里面存的东西。假设m=&q,我们可以用***m去访问i的值。如果*后面接的不是地址,这个量也会被认为是地址,执行*运算后,就会不知道指向哪里,就有乱码之类的情况出现。
简单言之,*m取值10101010,&q取地址0X12345678
例如在32位机中:
32/8=4B
BUS 数据总线+地址总线+控制总线
一个具有20位地址和32位字长的存储器,问该存储器能储存字节信息4m,寻址空间为1m
int *p,i ; p=&i ;
这一句告诉计算机有一个指针p , 它指向 i 所占的4个字节的第一位,由于提前告诉计算机,我这个是int型指针,计算机就知道p指向的变量到底有多长,所以当执行p+1时,这个时候计算机就知道要跳过4个字节。
二级指针——指向指针的指针
作用:首先主要在数据结构之中当改变指针的时候就需要通过改变指针的指针的值来改变!
在数据结构中用处很广.最普遍的比如说链表,通过调用函数改变了链表中的元素,那么整个链表就发生了变化,这种情况下就会用到二级指针
q里面存的是p指针所在的地址,因为int *p是会给指针p分配一个地址,这个地址里面,存着地址A。
*q就是查看&p这个地址里面存的到底是什么内容。这里的话就会发现,它存的是地址A。
那么**q就等同于*p,而*p又表示 i 的内容。
三级指针
假设 a、p1、p2、p3 的地址分别是 0X00A0、0X1000、0X2000、0X3000,它们之间的关系可以用下图来描述:
方框里面是变量本身的值,方框下面是变量的地址。
***p3等价于*(*(*p3))。一级指针*p3 得到的是 p2 的值,也即 p1 的地址;二级指针*(*p3) 得到的是 p1 的值,也即 a 的地址;经过三次“取值”操作后,三级指针*(*(*p3)) 得到的才是 a 的值。