指针(2)

之前我们已经知道了指针名代表整个数组的两种情况:

1、sizeof(数组名),这里的数组名代表整个数组

2、&数组名,这里的数组名代表整个数组

下面我们来谈谈这些:

指针数组、 数组指针、 函数指针 、函数指针数组、 指向函数指针数组的指针 

一、指针数组:

概念:指针数组就是数组,里面存放的是指针


存放的指针也可以为字符型 char *arr[10]、浮点型float *arr[10]....

这里也可以为二级指针数组:int **arr[10]

扫描二维码关注公众号,回复: 1669853 查看本文章

二、数组指针

概念:数组指针是指针,是存放元素为数组的指针。 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

猜你喜欢

转载自blog.csdn.net/z_juan1/article/details/80410565