0
点赞
收藏
分享

微信扫一扫

C语言-指针进阶

一、字符指针

char* p= "hello world"

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

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

典型例题:

C语言-指针进阶_C语言

二、指针数组

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

举例:

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

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

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

三、数组指针

数组指针是数组还是指针

是指针!指向数组的指针

代码举例:

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

int *parr)[10] = &arr;

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

&数组名 vs 数组名

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

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

C语言-指针进阶_C语言_02

C语言-指针进阶_C语言_03

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

但有两个例外:

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

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

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

C语言-指针进阶_C语言_04

应用举例:

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

C语言-指针进阶_指针进阶_05

区分:

C语言-指针进阶_指针进阶_06

C语言-指针进阶_指针进阶_07

四、数组参数、指针参数

1、一维数组传参

C语言-指针进阶_C语言_08

2、二维数组传参

C语言-指针进阶_指针进阶_09

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

C语言-指针进阶_指针进阶_10

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

3、一级指针传参

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

C语言-指针进阶_指针进阶_11

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

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

4、二级指针传参

C语言-指针进阶_C语言_12

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

可以有三种形式:

C语言-指针进阶_C语言_13

知识汇总:

C语言-指针进阶_C语言_14

五、函数指针

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

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

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

C语言-指针进阶_指针进阶_15

C语言-指针进阶_指针进阶_16

注意:

C语言-指针进阶_C语言_17

函数指针编写格式:

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

如,对上述Add函数:

C语言-指针进阶_指针进阶_18

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

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

阅读两段有趣的代码:

C语言-指针进阶_C语言_19

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

代码一解读:

C语言-指针进阶_C语言_20

代码二解读:

C语言-指针进阶_指针进阶_21

代码二,函数声明简化

typedef - 对类型进行重定义

C语言-指针进阶_指针进阶_22

六、函数指针数组

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

C语言-指针进阶_C语言_23

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

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

C语言-指针进阶_C语言_24


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

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

如何定义?

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

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

p2为函数指针的数组

C语言-指针进阶_C语言_25

八、回调函数

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

C语言-指针进阶_C语言_26

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



举报

相关推荐

[C语言]指针进阶

C语言——指针进阶

C语言指针进阶

C语言 指针进阶

C语言_指针_进阶

c语言---指针进阶

0 条评论