| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> c/c++ 一级指针二级指针指针数组数组指针函数指针指针函数 -> 正文阅读 |
|
[C++知识库]c/c++ 一级指针二级指针指针数组数组指针函数指针指针函数 |
前言学习c/c++的时候最让我们头疼的就是指针,各种类型的指针,各种概念 一直都流传着这样的顺口溜 指针数组是数组 数组指针是指针 指针函数是函数 函数指针是指针 看他最后两个字是什么 他就是什么 让我们看看什么是指针 正文指针和内存息息相关 先让我们看看内存 我们先要明确几个概念 ?这段内存大家都很熟悉 都知道数组名就是这个数组的首地址那我们怎么解读这块内存 ?分两块看这个内存 前边是内存的编号 后边是这个编号里面存的值 什么是内存的编号? 内存是连续的 一个接着一个 所以我们为了方便找到他们 给他们起了名字 也就是这块内存的地址 所以指针里面就是存了这些内存的编号 换句话说 指针存储了这块内存的地址 也就是指向了这块内存 通过指针就可以找到这块内存? 所以在32位程序下 指针不管什么类型 都是四个字节 因为最大的寻址范围就是32位(4字节) 那我们还要指针类型干什么哪 指针类型是在你解引用(取内容)的时候取相应类型的字节数 一级指针一级指针顾名思义 就是这个指针是一级的 废话哈 这里的级也就是有几颗* 思考如下代码 现在a的值是什么? ?我们分析一下 a是一个变量 那变量都有自己的内存 那这块内存按我们上面的话说 也应该有个内存编号(地址) 那是不是应该是这个格式? 0x00400000(随便写的地址)? 05 00 00 00 ...... 对a做取地址操作(&) 看到内存果然是这样? 0x00f3fc98 是内存的编号(地址) 05 00 00 00 是这个内存编号里面存的值 在看这个代码 第二行 ?int* p也就是我们定义了一个int* 类型的一级指针 这个指针有自己的内存 对a做了&操作 也就是说把a的内存编号存放在p的这个指针变量中 格式大概是:0x00400000(随便写的地址)? 00 f3 fc 98? ? 果然是这样 存储了a的地址 那我们有了a的地址 想找到a并不是什么难事 0x00f3fc8c 内存编号(地址)? ?也就是我们指针的内存编号 00 f3 fc 98 内存编号里面存的数据 也就是a的地址 ? 接下来我们再看第三行 *p = 6? *p是什么操作哪 可以说是取内容也可以叫解引用? 怎么开心怎么叫吧 作用是拿p存储的地址里面的内容 也就是拿到6 ?也就是说 *p和a 是等价的 改变了*p的值也就是改变a的值 a的值改变了也就是改变了*p的值 因为*p和a操作的都是00 f3 fc 98 这个内存编号的内容 回顾我们刚才的问题? 最后a的值是什么? 相信大家有自己的答案了 二级指针先看代码??//*p1 是谁 ?**p1又是谁
?我们理解了一级指针想理解二级指针也不是什么难事 先说什么是二级指针: 一级指针存储了一个变量的地址 二级指针存储了一级指针的地址 也就是说 指针指向指针 ?那我们上面说的*p1是谁 **p1又是谁? 我们不妨在内存中看一下 ?所以*p1拿到的是p? **p1拿到的是a 更改**p1的值也就是更改a的值 也就是更改*p的值 关系: **p1 <==> *p <==> a 数组指针????????数组指针指向一维数组顾名思义他是指针 是一个指向了数组的指针 我们的一维数组 数组名也就是元素0的地址 那我们怎么定义一个数组指针哪 这个是数组指针吗?
通过我们之前的知识 p指向的地方是一个数组吗 答案?并不是 他只是指向了数组0这个元素 对他解引用得到的是int类型 也就是数组下标为0的值 那我们平时是怎么定义一个指针指向一个变量的哪 对这个变量做取地址操作 同理我们对a做取地址操作 我们先随便用个变量接一下 看他的报错 他说要一个int (*)[5]的类型 按他的要求定义下 ? ?现在我们看 已经不报错了 所以p就是指向一个一维数组的指针 也就是数组指针 p的类型就是 int (*)[5] 有的人会说指针为什么要这么写 固定写法吧 我也不知道 提到指针 肯定就会想到取内容 所以好多人就晕到了这里 为什么p和*p地址是一样的感觉取不取内容没有任何的区别 其实他们存的内容确实是一样的 但是他们的类型却完全不同 这里可以理解为二维数组的首地址和二维数组里第一个一维数组的首地址是重合的 ? 还是用老方法让编译器告诉我们他是什么类型 p刚才说过是int (*)[5]类型? ?在看看*p 他是int*类型 记得我们上面写的什么是int*来着 ?这个是int*类型 所以我们*p就返回了这个一维数组 *p也就是相当于a 也就是指向数组0元素的地址?
所以我们怎么拿到0元素的内容哪 仔细思考下 是不是这样 ? ???数组指针指向二维数组p指向了一个一维数组 *p也就是拿到了这个一维数组 所以他并不是一个指向这个二维数组的指针 ?怎么指向一个二维数组哪 对他进行&操作 他说要一个这个类型 所以这个才是指向了一个二维数组的指针 ? ?这一通操作下来我们拿到了a[0][0] 也就是1
指针数组首先他是一个数组 这个数组里存了十个int*指针?
?函数指针"应同学的要求 让我好好写一下函数指针 满足他的要求 至于写成什么样 看发挥" 函数指针 首先它是一个指针 也就是指向这个函数的指针 我们在写一个函数以后 编译时 编译器会给这个函数分配一定量的空间 这个空间的首地址也就是这个函数的地址(函数名) 既然他是个地址 我们就可以用指针指向这个地址 指向这个空间的首地址的指针 也就是我们常说的函数指针 函数指针的定义 函数有返回值 有参数 那我们想指向这个函数 我们的指针也要有返回值和参数 特别简单的加法函数 我们先分析 返回值是int 还有两个参数也是int 那我们的函数指针也要具备这些
?指针函数指针函数是函数 也就是返回值是指针的函数 称为指针函数 ?小练习思考后看答案 ? ? |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:46:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |