| |
|
开发:
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语言初阶指针:一. 指针是什么
我们可以这样理解: 这里是编译器里面的一个存储数据的内存,然后我们把他分为若干个字节,每一个字节叫做一个内存单元。每一个字节进行一个编号,这个编号是唯一跟这个单元匹配的,用这个编号就可以找到这个内存单元。
那既然存储的内存单元是有编号的,我们来看看下面的代码:
上面的代码中,我们先创建变量a,也就是在内存中开辟一块空间存放a的值,而 所以总的来说:
那么这里存在两个问题:
上面我们说到,指针是存放地址的变量,那一个地址多大呢,又有多少地址呢,编址能拥有多大的空间呢,这就是我们接下来要研究的问题。 我们知道,机器有32位的,也有64位的。那32位的机器有32根地址线,然后通电后的高电频低电频由电信号转化为数字信号,这个数字信号就是1或者0,而32根地址线产生32个1/0。 那一个内存单元多大才合适呢,这里我们有 每一个地址一个字节,那么就有4GB的空间来进行编制,对于计算机来说是足够的了。同样的方法,64位机器,如果给64根地址线,那能编址多大空间,有兴趣的小伙伴可以自己计算一下。 所以总结起来就是:
二. 指针和指针类型首先我们知道变量有不同的类型,整形,浮点型等,那指针也有不同的类型吗,答案是:有的。 我们来看一下这个代码:
答案是不可行的,因为p根本没有定义。我们现在是想用p来存储a的地址,所以p也要带上他自己的类型,也就是 p就是一个指针变量,也有自己的类型,指针变量的类型:
我们可以发现:指针的定义方式是:
1.指针±整数我们来看下面一段代码:
这一段代码的意思是:创建一个int变量,用 我们可以观察到,n的地址是00CFFD0C(当然每一次运行的时候都有可能不一样),然后我们创建的 这里就涉及到指针 ± 整数的意义了,指针在 ± 整数的时候,实际上就是往下一个地址去,那作为指针(地址)我们知道是有大小的,比如存一个int类型的变量的地址要4个字节,所以我们在指针±时,也是要一个这样的大小。比如上面的代码中,char类型的 总的来说就是:
2.指针的解引用解引用过程中也是同样关乎到大小的问题,我们用代码来说明:
我们来逐步观察这个代码的变化: ① 这里的第一步就是创建n变量,第二步创建 ② 在这里,第三步转换第四步的时候,实际上就是执行了 ③ 这里第四到第五步中,执行的是
说明了在指针解引用操作的时候,你所存储地址的指针类型是多大,你能操作的地址就是多少,比如 所以总的来说:
这就是指针类型的意义。 三. 野指针1.什么是野指针?
2.为什么会有野指针呢?野指针的成因是什么?其实野指针就是没有指向具体位置的指针。而成因主要有以下三种: ①指针未初始化
我们创建指针变量,通常会指向某一个确定的变量的地址,但是直接创建指针变量却不初始化,那这个指针就如同无家可归的孩子,只能随机找一个地方呆了。然后给这个指针解引用赋值,也是赋值到了不知道何处。这就是其中一种野指针。 ②指针越界访问
这里就是超出数组范围后,虽然指针指向一个地址本身是没有错的,但不能去改变里面的内容,这样子就是错误的了。当超出数组范围后,指针就是越界访问了,就不是一个正常的指针了。这就是第二种野指针。 ③ 指针指向的空间释放
在这里我们创建一个p的指针变量,然后调用fun函数返回a的地址,但是注意,这里fun函数在返回地址后就会销毁,也就是说这个函数调用完之后推出就不见了,当我们的p指针变量去找他的时候,那里已经不是a确定的地址了,这是十分危险的。 但是我们运行后得出来*p的值仍然是10,但这并不是a的10,而是这个内存中这一个地址里面的数据没有变,p指针找过去得到的而已,所以这也不是一个确定具体的地址。当这个地址被覆盖的时候,得到就也就不会还是10了。这就是第三种野指针。 ④如何规避野指针
PS:如果不懂得函数创建销毁的,可以看一下【C语言】函数栈帧的创建与销毁这里面具体讲到了代码每一步运行是怎样的,基于栈帧的运行时,函数是怎么创建销毁的。 四. 指针运算1.指针运算类型:
等等 看到第二点的时候就会有人觉得,指针有±整数,为什么第二点就只有指针-指针,而没有指针+指针呢?这是因为指针+指针,就是地址加地址,有什么意义呢,这如同日期-日期知道天数差距,日期+日期却没什么意义,所以我们不讨论指针+指针。 2.指针±整数我们来看这一段代码:
这里的 这里就有指针±整数了,指针±整数,实际上就是以该指针类型大小向后面的内存中划出一个指针类型大小,然后指向这一个地址。图示可能更容易理解: 这里虽然到 3.指针-指针对于指针-指针呢,我们看这个代码;
这里我们创建一个数组,然后地址-地址,也就是指针-指针,得到的是什么呢?我们来看一下结果: 得到的是他们之间的内存空间吗,其实并不是。结果是9和-9,这是什么意思呢,其实指针-指针的含义是这样的:
所以我们得到的是arr[0]到arr[9]之间的元素个数,也就是0-8这9个元素。 4.指针的关系运算我们知道关系运算有等于、大于、小于、大于等于、小于等于和不等于六种。对于指针来说,等于和不等于就是判断两个指针的值是否相同或不同,即两个指针是否指向了相同或不同的地方。而大于和小于是判断指针的值哪个大哪个小。值较小的在存储器中的位置比较靠前,值较大的在存储器中的位置比较靠后。 我们用一个代码来说明:
这里就是拿指针变量vp和数组比较,然后按照大到小依次把数组里面的值变为0,指针的比较就是指针的关系运算。 但比较的也有他的前提:
这就是指针的运算。 五. 指针和数组数组名是什么?老规矩,上代码:
我们来观察一下,数组名和数组首元素地址有什么联系,结果: 我们会发现,数组名和数组首元素的地址是一样的,这可以让我们得出一个猜测的结论:数组名表示的是数组首元素的地址。 这个结论是不是正确的呢,我们来测试一下让数组名代替首元素地址看看得出的是否可以正常运行。
答案是可行的,当我们将arr表示的地址存储起来后,让指针变量p±整数时,变化的就是该数组的元素输出,那我们就可以直接通过指针来访问数组,所以arr所表示的地址确实为数组首元素的地址。 但是也有例外,
我们先看打印结果: 然后我们来分析一下: ② sizeof(数组名)所打印的是整个数组的大小,这里10个元素表示40字节。 ③ 取地址+数组名打印的也是首元素地址,但他并不是表示数组首元素地址,在我们加一后,跳过的并不是一个元素的大小,而是整个数组的大小,说明取地址+数组名代表的是整个数组的地址。 六. 二级指针
首先我们知道,指针是用来存放变量的地址的,那指针是不是变量,指针变量,当然是变量,所以是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针,那二级指针是不是变量,是变量,地址存储用什么,三级指针。(俄罗斯套娃又来了) 。 对于上面的二级指针的运算有: 1.三级操作二级
我们看这一个代码:
运行的结果为: 我们在一开始的时候是将a的地址存到了 2.三级操作一级
我们看这一个代码:
运行结果:30 这里就是说明其实三级指针也是可以二次解引用,访问a的地址,然后去操作a地址上的内容,这里 七. 指针数组
答案:是数组。是存放指针的数组。 数组我们已经知道有整形数组,字符数组等如: 那指针数组是怎样的?我们知道变量和指针都有不同类型,而同一种大小类型的变量和指针之间差一个
其实,这表示的意思就是 这几种数组或指针数组的意思和定义:
好啦,本篇的内容就到这里,小白制作不易,有错的地方还请xdm指正,互相关注,共同进步。 还有一件事: |
|
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 20:17:55- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |