指针知多少(指针进阶:贰)

接着上一次的内容继续

目录

1.数组指针

1.1数组指针的创建和初始化

1.2数组指针的使用

1.2.1一维数组

1.2.2二维数组

2.函数中数组和指针的传参

2.1数组

2.1.1一维数组

 2.1.2指针数组

2.1.3二维数组

2.2指针

2.2.1一级指针

2.2.2二级指针

3.函数指针

3.1函数指针创建和初始化

4.函数指针数组

4.1函数指针数组的创建和初始化


1.数组指针

数组指针的本质是指针,指针指向的数据是数组,数组指针和指针数组两个名称比较接近,所以一定要区分清楚

1.1数组指针的创建和初始化

int arr[5]={1,2,3,4,5};
int (*a)[5]=&arr;

这里有几点需要注意:

1.操作符“[]”的优先级要高于操作符“*”,所以*a需要用操作符“()”将其括起来,否则a首先和[]结合,那便不是数组指针了

2.数组名在大多数情况下就是首元素的地址,但有两个特例:

        (1)单独在sizeof内部:sizeof(arr),类似sizeof(arr+1)中因为不是单独出现所以依旧是首地

址的元素

(2)&arr,此时arr是整个数组的地址

1.2数组指针的使用

以打印数组的元素为例

1.2.1一维数组

一般打印一维数组的时候int*、char*这些类型的指针即可,虽然数组指针也可以使用,但比较复杂

1.2.2二维数组

首先要说明的是,二维数组的首元素不是arr[0][0],而是a[0],即数组的第一行

需要说明的是:c[i][j]可以达到同样的效果,但程序读取过程和上图相同

既然有指针数组,又有存放数组的指针,那么有没有存放数组指针的数组?

答案是有的,int(*arr[5])[3],这便是存放数组指针的数组,如果你想,你可以接着往下写存储着存放数组指针的数组的地址的指针(无限套娃)

2.函数中数组和指针的传参

主要归纳一下理论上数组和函数作为形参和实参可以接收什么样的参数和被什么参数接收

2.1数组

2.1.1一维数组

作为形参可接收参数作为实参可被接收参数
一维数组int*、char*等类型的指针
一维数组

 2.1.2指针数组

严格来说,指针数组应该也算一维数组,不过考虑到元素特殊,所以单独分开

作为形参可接收参数作为实参可被接收参数
指针数组指针数组
二级指针

2.1.3二维数组

作为形参可接收参数作为实参可被接收参数
二维数组二维数组
数组指针

2.2指针

2.2.1一级指针

作为形参可接收参数作为实参可被接收参数
一级指针一级指针
对应数据类型的变量二级指针
对应数据类型的一维数组

2.2.2数组指针

作为形参可接收参数作为实参可被接收参数
数组指针数组指针
二维数组二级指针

2.2.3二级指针

作为形参可接收参数作为实参可被接收参数
二级指针二级指针
一级指针
数组指针

3.函数指针

存放函数地址的指针

3.1函数指针创建和初始化

假设有一个函数:int add(int x,int y)

创建和初始化如下:

int (*p)(int,int)=&add;

函数指针中“*”可以省略(只有函数指针中“*”才能省略

既然有函数指针,那么就肯定有存放函数指针的地址

4.函数指针数组

4.1函数指针数组的创建和初始化

假设上述的函数有多个,分别有p1、p2等多个函数指针指向它们

int(*p[5])(int,int)={p1,p2,p3,p4,p5};

函数指针和函数指针数组的使用会在后面的博客中介绍

内容大致介绍到这里

在结尾前有两个出自《C陷阱和缺陷》的代码,你可以看看能否读懂,答案在结尾

1.(*(void (*)())0)();

2.void (*signal(int , void(*)(int)))(int);

1.(*(void (*)())0)()

首先弄清楚两个“*”是和谁结合,最里面的“*是和void()结合,所以是函数指针,外面的"*”和0结合,所以是对0解引用,0本身是是不需要解引用的,这里被解引用,所以0的类型被强制转换了,所以这个代码是将0强制转换成void(*)()类型,然后进行解引用

2.void (*signal(int , void(*)(int)))(int);

从signal入手,signal首先和()结合,所以这是一个函数,signal是函数名,括号中的int和void(*)(int)是函数的参数,剩余的void(*)(int)是函数的返回值

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星鸦wyk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值