C语言-指针进阶

目录

一、字符指针

二、指针数组

三、数组指针

四、数组参数、指针参数

1、一维数组传参

2、二维数组传参

3、一级指针传参

4、二级指针传参

五、函数指针

六、函数指针数组

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

八、回调函数

一、字符指针

char* p= "hello world"

printf(*p),程序语句会输出“h”

本质上是把“hello world”这个字符串的首地址存储在了字符指针变量p

典型例题:

二、指针数组

指针数组是数组,数组中存放的是指针(地址)

举例:

int* arr1[3],   存放整型指针的数组

char* arr2[3],一级字符指针数组

char** arr3[3],二级字符指针数组

三、数组指针

数组指针是数组还是指针

是指针!指向数组的指针

代码举例:

int arr[] = (1,2,3,4);

int (*parr)[10] = &arr;

parr就是一个数组指针,存放的是数组的地址

&数组名 vs 数组名

&数组名:取出的是数组的地址

数组名:取出的是首元素的地址

通常情况下,数组名是数组首元素的地址

但有两个例外:

1、sizeof(数组名)-数组名表示整个数组,计算的是整个数组大小,单位是字节

2、&数组名-数组名表示整个数组,取出的是整个数组的地址

对数组指针进行解引用相当于得到一个数组名

应用举例:

在函数中,用数组指针接受二维数组地址参数,

区分:

四、数组参数、指针参数

1、一维数组传参

2、二维数组传参

总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。原因在于,为了方便运算,二位数组可以不知道多少行,但必须知道一行多少元素

总结:二维数组如果以指针形式传递,需要数组指针

3、一级指针传参

一级指针传参,一级指针接受

思考:当一个函数的参数参数部分是一级指针时,函数接受什么参数呢?

同样,函数接受的是一个一级指针

4、二级指针传参

思考:当函数的参数是二级指针的时候,可以接受什么参数?

可以有三种形式:

知识汇总:

五、函数指针

指向函数的指针!存放的是函数的地址

&函数名 - 取到的就是函数的地址

同时:函数名,也是函数的地址

注意:

函数指针编写格式:

返回值类型 (*指针名)(参数类型......)

如,对上述Add函数:

如何用函数指针调用函数?

//二者等价
int ret = (*pf)(3,5)
int ret = pf(3,5)
//不可写成
int ret = *pf(3,5)
//原因在于()的优先级高于*,
//理解为对pf函数的返回值进行解引用

阅读两段有趣的代码:

推荐《C陷阱和缺陷》,本书中又提及这两个代码

代码一解读:

代码二解读:

代码二,函数声明简化:

typedef - 对类型进行重定义

六、函数指针数组

概念:存放函数指针的数组

同理:在函数指针数组中,Add可以写为pf1,Sub可以写为pf2,原因上文有所提及,二者等价

函数指针数组的用途:转移表—《c和指针》,起跳板作用,简化代码

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

释义:是一个指针,指针指向一个数组,数组的元素都是函数指针

如何定义?

数据类型(*(*指针名)[数组长度])(参数类型 ,参数类型)

举例:int(*(*p3)[4])(int,int) = &p2

p2为函数指针的数组

八、回调函数

        回调函数是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们称其为回调函数

喜欢或有所帮助,就帮忙点个赞吧~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值