C语言——函数指针 数组指针 指针数组 指针的指针

函数指针:
在c语言中,一般函数都是占用一段连续的内存区,而函数名就是这段连续内存区的首地址,而且指针也代表着地址。所以,我们可以吧函数名(函数首)赋值给指针变量,用指针来调用这个函数。
格式:int (*p)() :表示指针p指向一个无形参,且返回值是int型的函数。
p(); :调用时的格式。

注:int (*p)() 中( *p ) 的括号必须要加,不然像int *p() , 会被认为定义一个函数。****而int (*p)()则是定义一个指针变量指向函数,这就是两者的区别。(右左法则)。
在这里插入图片描述
在这里插入图片描述

关于函数指针的更多应用:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

重要知识点:
在这里插入图片描述
右左法则:先找到变量,然后遵循右左的规则,一步步来。
1> 变量fp右边是括号,然后看左边,是*号,所以是定义了一个指针fp,然后再看右边,是(int),所以就是指向一个函数,并且函数的传递类型形参是int型,看左边是 * 表示函数返回值指针类型。[10]表示是十个元素的数组,加上int * 就表示整型指针数组。
连起来就是,fp是个指针,然后指向形参为int类型,返回值为指针的函数,而返回的函数又指向十个元素的整型指针数组。

2> 定义了五个元素的指针数组。数组存的指针指向无参,返回指针的函数,返回的指针又指向无参,返回是整型指针的函数。

数组指针和指针数组:
说白了,数组指针就是一个指针指向一个一维数组,而指针数组就是一个数组,数组里边存储的是指针。
我们以二维数组举列说明:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以a[2][3]和b[5]一个二维数组a和一维数组b为列。
一级指针: b 、 a[0] 、*a 、 *(a+1) 、&b[0]
二级指针:a 、 &b、&a[0]
三级指针:&a

指向指针的指针:
int *p :p指向int * 类型。
int **p : 表示这个指针指向的是int *类型的。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
图二的过程是错误的,图一才是正确的解法。
原因:图二定义了一个指针p,p中指向的地址是无效地址(野地址),然后它把无效地址转给了s,然后s申请内存,但是action函数运行结束,p指向的地址依旧没有改变,还是无效地址。但是图二就不一样。它传给s的是指针p的地址,而不是该指针p指向的地址,所以*s代表的是p指向的地址,malloc申请的空间的首地址代替了p原本指向的地址,所以有效。

内存:画图解释。
在这里插入图片描述
头文件:include如果是<>表示系统会到系统指定目录查找。如果是“”则表示先到当前目录查找,如果没有会到用户指目录查找,最后会到系统指定目录查找。

宏定义:定义变量和函数,为宏变量,无参宏函数和有参宏函数。
宏函数和普通函数的区别:优缺相反
宏函数优点:执行效率高,节省空间。
普通函数:编译效率高,有类型检查更安全。
在这里插入图片描述
在这里插入图片描述
上面是宏定义的一些用法,算数的那道是将sor(a+b)直接转成a+b*a+b,如果要修改,则将#define sor(x)(x) * (x) 就是在x周围加上();

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值