概述
之前我们已经知道了指针名代表整个数组的两种情况:
1、sizeof(数组名),这里的数组名代表整个数组
2、&数组名,这里的数组名代表整个数组
下面我们来谈谈这些:
指针数组、 数组指针、 函数指针 、函数指针数组、 指向函数指针数组的指针
一、指针数组:
概念:指针数组就是数组,里面存放的是指针
存放的指针也可以为字符型 char *arr[10]、浮点型float *arr[10]....
这里也可以为二级指针数组:int **arr[10]
二、数组指针:
概念:数组指针是指针,是存放元素为数组的指针。 int (*p)[10]
整形指针:int (*p)[10] ;能够指向整形的数据的指针
浮点型指针:float(*p)[10];能够指向一个浮点型的指针
其中这个里面的数组也可以为指针类型,即为指向指针数组的数组指针:(int *(*p)[10])
再将此放入到数组里,即为指向指针数组的数组指针的指针数组:(int *(*p[10])[10])
关于二维数组传参:
1.二维数组传参时,第一个维度是可以忽略的
2.任何数组传参都会将维成指向其内部元素类型的指针
关于指针和数组的定义和声明:
定义:1.开辟空间 2.初始化
声明:无需开辟空间,主要名称和类型
注意:定义为数组 ,不可声明为指针,反之也不行。
关于数组参数、指针参数:
二维数组传参:只可省略第一个[],因为对一个二维数组来说,你可以不知道有多少行,但必须知道一行有多少个元素
一级指针传参:是传址。当函数的参数部分为一级指针可以接收的参数有:一维数组,一级指针...
二级指针传参:当函数的参数部分为二级指针可以接收的参数有:指针数组,二级指针,一级指针的地址...
三、函数指针
概念:指向函数的指针: (int *test)()=test/&tset 这里可以看到函数的地址:1.函数名代表函数的入口地址 2.&函数名
返回值可以为字符型:(char *test)()、指针类型:(int*(*test)())、指针数组类型:(int*(*test)[10]())
数组指针类型:(int(*)(*test)[10]())
我们来看看两个有趣的代码:
1.(*(void(*)()0)()
此时将0强转为函数指针类型,也就是函数的地址,这时我们就会将0当做地址看待,这个地址是返回值为空的函数的地址,然后在*,取出里面4字节的内容,然后在对此取出的4字节函数地址进行调用,即调用这4字节地址所指向的函数。
2.void ( *signal (int, void(*)(int) ))(int)
函数参数一个为int,一个为红色区域函数指针(是类型,可以定义变量),返回值为函数指针。
四、函数指针数组
概念:是一个数组,里面存放的是函数地址 。int (*parr[10])( ) 由于数组元素个数也是数组类型的一部分,所以声明的指针变量中的[10],必须和它指向的函数指针数组元素个数一样。
用途:转移表。可以在这里看啦
https://blog.csdn.net/Z_JUAN1/article/details/80412525
五、指向函数指针数组的指针
概念:是一个指针,指向想一个数组,数组的元素为函数指针。
void(*pfun)()——函数指针
void (*pfun[10])()——函数指针数组
void (*(*pfun)[10]))()——函数指针数组的指针
回调函数:
概念:通过函数指针调用的函数。把函数指针(地址)作为参数传递给另一个函数,当这个指针被用来调其所指向的函数时,我们就称之为回调函数
当满足一定条件时方可调用此函数。
回调函数可以节省调用方的时间。
关于回调函数的应用看这里:
https://blog.csdn.net/Z_JUAN1/article/details/80420060
最后
以上就是高兴花卷为你收集整理的指针(2)的全部内容,希望文章能够帮你解决指针(2)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复