指针传2

几天没有写博客了,怎么说呢?这让我总感觉缺点什么,心里空落落的,你懂吧!

好了,接下来开始我们今天的正题!

 1. ⼆级指针 

我们先来看看代码:

首先创建了一个整型变量a,将a的地址取出来存放在p中,之后我们又创建了一个指针变量pp来取出p的地址进行存放,右边一个*表示pp是一个指针变量,左边的int*则表示pp所指向的对象类型是int*的。那么我们通过对pp的解引用也改变了a的值。

**pp 先通过 *pp 找到 ,然后对 进⾏解引⽤操作: *p ,那找到的是 a

2. 指针数组

什么是指针数组呢?我们可以类比得出,前面我们又整型数组:是存放整型的数组,字符数组:是存放字符的数组,那么指针数组:就是存放指针的数组了!指针数组的每个元素都是⽤来存放地址(指针)的。

p[i]是访问p数组的元素,p[i]找到的数组元素指向了整型⼀维数组,p[i][j]就是整型⼀维数
组中的元素。
int* p[5]就是指针数组,p表示指针数组变量名,p指向对象有5个元素,*表示p所指向的对象是指针变量,int则表示p所指向的对象为整型。

3. 数组指针变量

上面我们学习了指针数组,指针数组是⼀种数组,数组中存放的是地址(指针)。
那么我们的数组指针呢存放的应该是数组的地址,能够指向数组的指针变量。
我们来看看下面哪一个是数组指针:
1   int *p1[10];
2   int (*p2)[10];
答案是我们的2咯, p先和*结合,说明p是⼀个指针变量,然后指向的是⼀个⼤⼩为10整型的数组。所以 p是⼀个指针,指向⼀个数组,叫数组指针。
注:[]的优先级要⾼于*号的,所以必须加上()来保证p先和*结合。

p是数组指针变量名

有了数组指针的理解,我们就能够讲⼀下⼆维数组传参的本质了。以前我们进行二维数组传参时,我们函数写的都是数组类型进行接收。二维数组其实的存储方式也是连续的,所以对于二维数组我们可以看成是一维数组的数组arr[0](arr则可以看成另一个一维数组)。
根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀ 维数组的地址。那就意味着⼆维数组传参本质上也是传递了地址,传递的是第⼀ ⾏这个⼀维数组的地址,那么形参也是可以写成指针形式的。

 我们看见确实可以实现,总结:⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式


4. 函数指针变量

函数指针变量是⽤来存放函数地址的
函数有地址吗?

那么我们确实打印出来了地址,所以函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名的方式获得函数的地址。如果我们要将函数的地址存放起来,就得创建函数指针变量,函数指针变量的写法就和数组指针非常类似。

 可以看见两种写法都是可以的哈,

 


分享两个有趣的代码:

1 (*(void (*)())0)();
void (*signal(int , void(*)(int)))(int);

 你知道它们各自代表的含义吗?

今天就到这里咯,咱们明天见,拜拜!

  • 23
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

并不会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值