| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 从0开始学c语言-20-指针与地址、指针类型、野指针、指针运算 -> 正文阅读 |
|
[C++知识库]从0开始学c语言-20-指针与地址、指针类型、野指针、指针运算 |
CSDN话题挑战赛第2期 ?本人0基础开始学编程,我能学会的,你也一定可以,学会多少写多少。 下载安装请从官网入手,社区版本即可,这里主要使用的软件是VS2019,图标如下。 ?上一篇:从0开始学c语言-19-隐式类型转换(整型提升)、算术转换、操作符属性及应用练习_阿秋的阿秋不是阿秋的博客-CSDN博客 相关文章:(之前这篇文章的指针认识有偏差,但是地址认识没错,不知道地址的可以看看这篇)从0开始学c语言-09-指针及指针大小、*、&、地址_阿秋的阿秋不是阿秋的博客-CSDN博客 目录 1·指针是什么指针理解的2个要点: 1. 指针是内存中一个最小单元的编号,也就是地址。 2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。 总结:指针就是地址,口语中说的指针通常指的指针变量。 地址和指针的区别那么既然指针就是地址,为什么不直接用地址,偏偏还造一个指针呢? 我先给上结论:指针就是有指向性的地址,地址在运用的时候便有了指向性,变为指针。 我们知道的是,数组名是数组的首元素地址,既然说地址在运用的时候就会变为指针,我们可以试试直接运用地址,而不是存到指针变量中再运用。如图。 ?可以看到现在我们并没有把地址存到指针变量中去,但是依旧可以使用*符号。 你可能会说,能用*也不代表就是指针啊,虽然我们通常是说*会表示后面的那个是指针。 别着急,继续看,后面我会解释。 也就是说,指针就是一个存放地址的变量,本质上指针是个地址变量。 你可能不太理解,这玩意都是在运用中感悟的,多用就会了。一定要记住我的结论。 指针变量(指针)
?看好指针的类型int*,*代表这是一个指针变量,前面的int代表指针指向的类型是int。
不信的话,你看我如何证明。 ?看到了吧,事实证明,p和&a都是指针。 现在回到上面数组那段代码遗留的问题,看看我说的对不对。这里放图。 arr+1后类型变为int*,也就是说它变为了一个指向int类型的指针变量。 而arr本身在未运用的时候,类型就是数组类型。 *arr当中的arr类型就是int*,在加上*变为*arr的时候,就是通过arr这个指针访问了这个住户,同时*arr的类型也为了int(把*去掉了)。arr+1也是同理。 还不理解就看这个图 ?可以看到,这时候的arr的类型发生了变化,就是有指向性的地址,也就是指针变量。 总结
2·指针类型变量有不同的类型,整形,浮点型等。那指针有没有类型呢? 有! 指针的定义方式是: type + * 。
char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放 int 类型变量的地址。 也就是说*前面的就代表指针指向的类型。 不同类型的指针有什么区别? ?指针+-整数
?仔细看好,同样是+1,但+1后的差距不同。
指针的解引用
这里我们看看不同类型的指针改变int a,在内存中的数据存放会如何变化
可以看到不同类型的指针访问权限不同,char*只能访问一个字节的内容,而int*能访问4个字节。
补充
看我注释中的解释,
3·野指针野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) 野指针成因1. 指针未初始化
局部变量指针未初始化,默认为随机值。 p通过随机值找到了一个地址来存放,这叫非法访问内存。因为内存里的空间是你申请并分配给你了,你才可以访问并使用,没有申请不能访问。 2. 指针越界访问
3. 指针指向的空间释放
如何规避野指针
练习判断这个指针是不是野指针?
看不懂循环中代码怎么运算的,看下面这段
答案:
4·指针运算指针+-整数
?形象一点就像这样,方块代表地址,也就是储存空间。 指针-指针两个指针相减,指针必须指向一段连续空间,减完之后的结构代表两个指针之间相差元素的个数
结果:9 ?框起来的就是指针之间的元素个数
再不理解就看这个图
应用拓展:求字符串长度
指针加指针没有意义,这里不多解释。 ?指针的关系运算
实际在绝大部分的编译器上是可以顺利完成任务的,然而我们还是应该避免这样写,因为标准并不保证它可行。 具体画图来说
内容先到这里,明天继续~ |
|
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 10:11:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |