我们在学习c语言中,可能遇到最难的部分就属指针了,那么什么是指针?有什么用?
首先来解释一下,指针概念:
仔计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地的值。由于通过地址能找到所需的变量单元,
地址指向该变量单元。因此,将地址形象的称为指针。
有什么用呢?举个例子,就如国家的管理,一个国家划分很多省,省又划分很多市,市又到县......一直到某个家庭,每个家都有自己的地址。
为方便管理。当然在计算机中,内存最小的一个字节,就有自己的地址,而指针就是为了方便管理用来指向某一个地址。
在c语言中,
1. 关于指针数组:
指针数组,首先明确它是数组,是一个存放指针类型的数组。
例如:int *arr[10] 这就是一个指针数组。怎么理解呢?
看图
在我们经常写main()函数里面的三个参数后面两个就是指针数组,char *argv[] char * envp[]
2 数组指针
还是先明确数组指针指针,这里我们来比较着解释,指针数组和数组指针容易搞混,在初学阶段,
指针数组上面相信大家已经有所了解,而数组指针,比如:int (*p)[10] 就是一个数组指针
在写法上数组指针就比指针数组多了(),而是因为[]的优先级高于* 。数组指针我们来理解一下,
上图:
简单的说就是指向数组的指针。
在这里还有一点,就是arr与&arr的区别,arr表示的是数组首元素地址而&arr表示的是整个地址。
比如:int arr [10] ; arr+1; &arr+1输出地址是截然不同,arr只加了一个int ,而&arr加了整个数组的长度。
3 函数指针
如果理解了数组指针那么理解函数指针就不难,因为函数指针就像数组指针,就是指向函数的指针,但是在语法上多动注意。
例如 void (* p)() 就是一个函数指针,其中p就是函数指针变量。那么会有人疑问,void * p ()是什么,这个很早就已知道,是返回值为void * 的函数声明。。
我们来看一个小练习,
( * ( void ( * ) ( ) ) 0 )();
这个题呢,是这样的,
( void ( * ) ( ) ) 是一个函数指针,而且加了()后面跟数字零,其实就是把零强转为函数指针类型,再解引用。
4 函数指针数组
如果理解了指针数组,这里理解起来应该不难,函数指针数组是数组,是存有函数指针的数组。
它的语法,也就叫做写法,例如:int (*p[10])();而这里的p[10]就是函数指针数组。
5 函数指针数组的指针
如果以上都已经理解,那么就很好理解函数指针数组指针,就像数组指针,这里就是指向函数指针数组的指针,怎么写呢?
也就是语法 例如:int (*(*p)[10])();这里的p就是指向函数指针数组的指针。