大家都知道,指针有双面性,灵活度高,但是运用时一定要避免野指针和空指针的出现。否则会出现一些意想不到的错误。话不多说,看下面的代码:

int main()
{int arr[10] = { 0 };//数组int* p=NULL;//指针int* pp[10] = { NULL };//指针数组int(*ppp)[10]=&arr;//数组指针int(*(*pppp))[10] = &*ppp;//指向数组指针的指针int (*a)(int, int) = NULL;//注:0地址是不能用的,这里只是打比方。函数指针int (*aa[10])(int, int) = { NULL };//函数指针数组int  (*(*aaa)[10])(int, int) = &aa;//指向函数指针数组的指针return 0;
}

指针:p是一个变量,*p表示p是一个指针变量,指向的类型是int。

指针数组:pp[10]是一个数组,*pp[10]表示pp[10]里的十个元素都是指针,每个指针指向的类型是int

或是可以这样理解,pp[10]是一个数组,每个类型是int *。

数组指针:*ppp表示是一个指针,指向数组

指向数组指针的指针:表示*pppp是指针,指向数组指针

函数指针:*a表示是指针,指向一个函数的参数类型为(int,int),返回值是int类型的函数。

函数指针数组:aa[10]表示一个数组,*aa[10]表示这个数组的每个元素都是指针,指向一个参数为(int,int)返回类型为int的函数。

指向函数指针数组的指针:*aaa表示是一个指针,指向函数指针数组

下面详解说一下:

先从指针说起吧,看下面

int *p
int*
int a
int

我们看到,定义一个普通的变量,去掉变量名,前面标识的就是他的类型,指针也也是这么理解

int* p是一个指向整形的指针,去掉*p,是不是剩下int,所以int 就是他指向的类型,而他本身的类型是int*。

指针数组:上面的代码中,为什么应该怎么理解呢?来看下面

int arr[10];//定义一个数组
int//数组去掉之后
int* pp[10] = { NULL }

按照我们上面的理解,数组去掉数组名,就是他每个元素的类型,指针数组也是一样,pp[10]表示是一个数组,去掉他,那么前面的类型就是int*,那么就代表pp[10]里面的每个元素都是指针,指向int(也是每个元素都是int*),看大家怎么理解了。

数组指针:还是一样的理解,我们先看代码,这样比较好理解

int(*ppp)[10]=&arr;//数组指针
int [10]=&arr;

这个按照上面的理解,去掉*ppp,是不是就剩下int [10]了,我们想象一下,int [10]中,int和[10]中间有一个名字,是不是就是数组啊,所以他就是数组,按上面的理解,去掉*ppp,剩下的就是他指向的类型,那他就是指向int [10]了,所以,他就叫指向数组的指针,我们通常说是数组指针。按照我们上面讲的,去掉ppp就是他的类型,所以他的类型是int(*)[10]。

int(*(*pppp))[10];
int(*)[10];

指向数组指针的指针:这个是什么意思呢?按字面意思来理解,指向数组指针,那数组指针是什么类型呢?是不是上面说的int(*)[10]。那么我们可以这样理解,*pppp是一个指针,他指向数组指针,那就是int (*(*pppp))[10],按照上面的理解,去掉*pppp是不是就是int(*)[10],想想刚才的指针是不是去掉*p就是他指向的类型,那么稀释去掉*pppp是不是就是int(*)[10],那他就是指向数组指针,所以他就叫做指向数组指针的指针。

函数指针:好多人一听这个就懵了,函数指针?难道是指向函数的指针?没错,就是指向函数的指针。看下面:

int (*a)(int, int) = NULL;//注:0地址是不能用的,这里只是打比方。函数指针
int (int, int) = NULL;//

按照我们前面说的,去掉*a就是他指向的类型,和数组指针一样,去掉之后剩下的int (int, int),我们可以想象一下他中间有个名字,比方说,int test(int, int),那此时是不是就是,有一个函数名叫test,他有两个参数,类型分别是int int.他的函数返回类型是int,那很简单,去掉*a就是他指针指向的地方,所以*a指向一个函数,我们通常说为是一个函数指针。

函数指针数组:

int (*aa[10])(int, int) = { NULL };//函数指针数组
int (*)(int, int) = { NULL };//函数指针数组

同样的理解方式,我们去掉数组名,剩下的是不是就是这个数组中每个数组类型,int (*)(int, int)是什么,是不是就是函数指针,所以数组中每个元素的类型都是他,也就是函数指针,所以我们通常就叫他为函数指针数组。

指向函数指针数组的指针:

int  (*(*aaa)[10])(int, int) = &aa;//指向函数指针数组的指针
int  (*[10])(int, int) = &aa;//指向函数指针数组的指针

同样的理解方式,去掉*aaa就是他指向的类型,我们看到上面,去掉*aaa是不是就是int  (*[10])(int, int) ,那么int  (*[10])(int,int)是不是就是上面说函数指针是数组,那么*aaa就是指向函数指针数组的指针。

总结,指针在定义是千万千万小心,个人认为他很灵活,但是很危险。但是话又说回来,如果理解到位,几乎是不会出现错误的,指针不是阻挡我们的绊脚石,而是我们的磨刀石。

如果此篇博客对你们有用的话,希望大家点下赞,下次会发布数组相关的知识,和我自己对数组的一些看法以及理解。(或许我的看法和理解大家都知道,但是相互交流,总会有新得方法出现,可以让我们共同进步)。

指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)相关推荐

  1. php 数组 指针,php之数组指针详解

    本文主要和大家分享php之数组指针详解,首先我们会和大家分享php 数组指的针操作方法,希望能帮助到大家. 一.php 数组指针操作 利用php的内置函数:key,current,next(),pre ...

  2. 指针数组与数组指针详解

    指针数组与数组指针详解 1.什么是指针数组和数组指针? 指针数组:指针数组可以说成是"指针的数组",首先这个变量是一个数组,其次,"指针"修饰这个数组,意思是说 ...

  3. C++ 智能指针详解

    智能指针内容很多,重点是基本用法. #include <boost/shared_ptr.hpp> class CBase: public boost::enable_shared_fro ...

  4. C/C++ 指针详解

    指针详解 参考视频:https://www.bilibili.com/video/BV1bo4y1Z7xf/,感谢Bilibili@fengmuzi2003的搬运翻译及后续勘误,也感谢已故原作者Har ...

  5. c语言的指针详解ppt,最全的C语言指针详解.ppt

    最全的C语言指针详解.ppt 第6章 指针,6.1 指针定义与使用 6.2 指针与函数 6.3 指针与数组 6.4 指针与字符串 6.5 指针数组与多级指针 6.6 指针与动态内存分配 6.7 指针的 ...

  6. C/C++指针详解之提高篇

    目录 一. 堆空间与指针的相爱相杀 1.1 堆上一维空间 1.1.1 返回值返回(一级指针) 1.1.2 参数返回(二级指针) 1.2 堆上二维空间 1.2.1 指针作返值输出 1.2.2 空间申请与 ...

  7. C++Study 指针详解

    C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...

  8. 筑基九层 —— 指针详解

    目录 前言: 指针详解 前言: 1.CSDN由于我的排版不怎么好看,我的有道云笔记比较美观,请移步有道云笔记 2.修炼必备 1)入门必备:VS2019社区版,下载地址:Visual Studio 较旧 ...

  9. C语言结构体中定义函数指针详解

    C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...

  10. C语言指针详解(全解)—— 前篇

    关于指针的基本概念及相关运算写在了上一篇博客 C语言指针详解(初级)_Seinrich的博客-CSDN博客 本篇博客来详细的解说一下指针,深入探讨指针 一.指针与const const修饰的变量为常变 ...

最新文章

  1. 本地方法接口和本地方法栈
  2. html中事件调用JavaScript函数时有return与没有return的区别
  3. 如何使用Java keytool命令行创建一个自签名证书
  4. 大前端快闪二:react开发模式 一键启动多个服务
  5. exchange 删除邮件
  6. 如何成为一名合格的数据分析师
  7. MySQL流浪记(三)—— Linux安装MySQL数据库5.7.30(亲测有效3分钟即可)
  8. 团队工作-------step2
  9. python+Django 完成第一个后端项目--创建投票应用(一)
  10. Linux下Ubuntu关闭触摸板(TinkPad)
  11. 手把手教你如何加入到github的开源世界!
  12. Spring之控制反转(IOC)
  13. 小米盒子 计算机共享,教你用局域网共享文件为小米盒子装软件
  14. python识别图片轮廓_教你用Python+opencv来识别物体的轮廓并标识显示
  15. 网络协议之TCP和UDP
  16. 第五---七章 交换机和路由器的基本配置
  17. php mpm,PHP使用Apache中的ab测试网站的压力性能及mpm介绍
  18. web前端-纯前端音频剪辑,vue音频编辑组件
  19. 揭秘信用卡代还软件对卡有什么影响?乐猫智服会封卡降额吗?
  20. Android版本号和版本名对应关系

热门文章

  1. 2021年中山大学计算机专业学硕复试线,2021中山大学研究生分数线一览表(含2019-2020历年复试)...
  2. 观《源代码》(电影)有感
  3. 联想V450 如何支持VT技术
  4. Shell编程-02-正则表达式
  5. 如何kill掉Ubuntu的僵死进程
  6. java query接口_Query接口学习笔记
  7. Mybatis plus 之 QueryWrapper、LambdaQueryWrapper、LambdaQueryChainWrapper
  8. Matlab仿真-信源仿真
  9. 宽度优先搜索python_宽的解释|宽的意思|汉典“宽”字的基本解释
  10. 【分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人(8/10)】